fix pingLoop use-after-free: respect cancellation, check isClosed
pingLoop swallowed error.Canceled from io.sleep(), preventing
ping_future.cancel() from stopping the task before client.deinit()
freed the stream/TLS buffers. next writeFrame hit freed memory → GPF.
two changes:
- io.sleep() catch {} → catch return (cancellation-cooperative)
- check client.isClosed() before writeFrame (defense-in-depth)
also bumps zat to v0.3.0-alpha.11 and websocket.zig to 104608b.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>