dispose method
Disposes of the client and cleans up resources
Implementation
Future<void> dispose() async {
if (_disposed) return;
_disposed = true;
_log('Disposing WebSocket client');
_heartbeatManager.dispose();
_reconnectionManager.dispose();
await _stateSubscription?.cancel();
await _messageSubscription?.cancel();
await _errorSubscription?.cancel();
await _adapter.dispose();
await _logController.close();
await _statsController.close();
}