feat: O(1) sorted sleep queue for process_wake_check
Replace O(N) scan of all processes with a sorted doubly-linked sleep
queue. process_wake_check now pops expired entries from the queue head
in O(1) time. The O(N) scan is retained only for alarm delivery.
Key design decisions:
- sleep_prev/sleep_next/in_sleep_queue fields added to struct process
- process_sleep() inserts into sorted queue under sched_lock
- schedule() handles deferred insertion for ksem_wait_timeout/futex
(SLEEPING set under external lock, inserted under sched_lock in
schedule — no preemption window)
- All wake paths (signal, kill, reap, sched_enqueue_ready) call
sleep_queue_remove to prevent double-insert corruption
- Defensive sleep_queue_remove before insert in process_sleep