92d08418ec
The Promise.race between this.loopPromise and this.delay(timeoutMs) discarded the timeout's underlying setTimeout handle whenever the loop branch won. The discarded timer was still ref'd by libuv and pinned the Node event loop alive for the remainder of `timeoutMs` — exactly the shutdown slack the timeout was supposed to bound. Inline the timer in stop() with a captured handle and clearTimeout() it in a finally block, so every exit path (loop-won, timeout-won, throw) releases the ref. The in-loop delay() calls are unchanged — they're awaited normally and their timers fire-and-clear themselves.