Synchronous resolveUserName/resolveChatName calls in the SDK dispatcher
callback blocked the event loop for 300-700ms on cache misses, causing
intermittent message drops in WebSocket mode.
The fix moves name resolution into the dispatchMessage goroutine, ensuring
the SDK dispatcher can process events without blocking. The dedup and
old-message checks remain synchronous for correctness.
Fixes#542
Co-authored-by: Claude <noreply@anthropic.com>