fix: dumduel bullets invisible — immediate snapshot on fire + UDP→WS fallback
Bullets could fire and hit between snapshot intervals (every 3 ticks)
without the client ever seeing them. Now broadcastSnapshot() fires
immediately on bullet creation. Also, stale UDP channels silently
dropped snapshots with no WS fallback — sendUDP now returns success
so broadcastSnapshot falls through to WebSocket when UDP is dead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>