fix(server): surface a child's signal death instead of recording exit 0
node-pty's onExit reports `{ exitCode, signal }`, but the daemon destructured
only `exitCode` — so a child killed by a signal (e.g. an OS OOM SIGKILL, which
arrives as signal=9 / exitCode=0) was recorded as a clean exit 0. A consumer
gating on "nonzero exit" (convoy's crash→ding) then mistook a real OOM death for
a clean finish and stayed silent.
Capture the signal and surface it the way a shell does — exitCode = 128 + signal
(SIGKILL 9 → 137) — so the existing nonzero gate catches it, and also carry the
raw `signal` on the session_exit event (+ render "killed by signal N"). Normal
exits are unchanged (no signal → raw exitCode).
- server.ts onExit: `{ exitCode, signal }` → effective code 128+signal.
- events.ts: SessionExitEvent gains optional `signal`; formatEvent shows it.
- docs/disk-layout.md: document the session_exit `signal` field + encoding.
- tests/exit-signal.test.ts: SIGKILL'd child records 137 + signal 9; clean exit
stays as its raw code with no signal.