Synchronous telemetry reader for a single drone.
Drains up to 50 buffered MAVLink messages per call, updating the
drone's position, heading, battery, and heartbeat timestamp.
Designed to be called from asyncio.loop.run_in_executor() so it
does not block the event loop on serial I/O.