migrate to zig 0.16: Io primitives, updated deps, timer regression fixes
phase 1 of the 0.16 migration — threads still use std.Thread.spawn,
but all synchronization primitives now use Io.Mutex/Io.Condition and
all sleep/timestamp calls go through std.Io.
- bump deps: zat v0.3.0-alpha.7, websocket edeca26, rocksdb 9be930b, pg dev
- build.zig: Module API (link_libc on root_module), .ignore/.trimEnd renames
- Dockerfile: zig 0.16.0-dev.3059
- main.zig: Io.Evented/Threaded backend selection, DebugAllocator, getenv helper
- all modules: Io.Mutex/Io.Condition, io.sleep(), Io.Timestamp, Io.Duration
- thread_pool: stays on std.Thread.spawn (CPU-bound keyed workers)
- event_log: sleep-based flush loop (Io.Condition has no timedWait)
- broadcaster: poll-based idle wakeup for consumer keepalive pings
- thread_pool submit: poll-based stop check to prevent shutdown deadlock
- lru/ring_buffer: Io.Mutex for cross-boundary access
- api/xrpc: Io.Writer.fixed() replaces fixedBufferStream
- collection_index: allocPrint for test paths (realpathAlloc removed)
next: port thread spawns to io.concurrent for upstream/downstream websocket paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>