refactor: replace O(N) alarm scan with O(1) sorted alarm queue
Phase D1 complete — alarm delivery now uses a sorted doubly-linked
queue identical in design to the sleep queue.
- process.h: added alarm_next, alarm_prev, in_alarm_queue fields
- scheduler.c: added alarm_queue_insert/alarm_queue_remove helpers,
alarm_head pointer, and public process_alarm_set() API
- process_wake_check: replaced O(N) scan of all processes with O(1)
pop from sorted alarm queue head
- syscall.c: alarm() syscall now routes through process_alarm_set()
which atomically manages the queue under sched_lock
- Alarm queue cleanup on process exit (process_exit_notify) and
signal kill (SIG_KILL path)