The event loop drew a frame, then polled for input with a fixed 250 ms
timeout, and redrew on every timeout. That meant ~4 frames per second
while idle, each one cloning the whole rendered Text.
The timer existed only so an expired status message would clear itself.
Now the loop blocks in event::read() when no status is pending, and
waits just the remaining TTL when one is. Idle CPU use drops to zero.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXf3FpFoCHAE9yJAm69GFy