Convert scan, analyze, capture, and cal to async with MCP progress
reporting via FastMCP Context. Blocking serial I/O wrapped with
asyncio.to_thread() so the event loop stays free to deliver progress
notifications during hardware sweeps.
Add connection keepalive: _ensure_connected validates stale connections
with a sync probe after 30s idle, and retries on cold-start failures
(fixes flaky first-connect after MCP server restart).
- Add Pillow dependency for server-side RGB565→PNG conversion
- capture() now returns fastmcp Image (PNG) by default
- Pass raw=True to get the original RGB565 base64 dict
- Eliminates 204K token overflow on default capture calls