WebSocket client wrapper