- Make get_client() sync (was async but did no async work). Callers
that omitted await silently got a coroutine object instead of the
SerialClient, causing "'coroutine' object has no attribute 'connect'"
errors on every tool call.
- Fix esp32_connect: use get_client_or_none() for init check and
client.event_queue.wait_for() for boot event (wait_event() didn't
exist on SerialClient).
- Normalise Response.data to dict at parse time — firmware returns
bare strings on some error paths, which broke .get() calls in tool
error handlers.
- Remove stale await from ble.py (9 calls) and classic.py (4 calls).
Tested with dual-MCP headless claude session: 26/27 PASS.