Calling request_redraw() inside AboutToWait immediately woke the event
loop on every iteration, making WaitUntil a no-op and producing a
busy-loop (98% CPU). Move request_redraw to NewEvents(ResumeTimeReached)
so the thread actually sleeps between frames.
Screensaver was consuming ~8% CPU due to ControlFlow::Poll rendering
as fast as possible. Switch to WaitUntil with configurable FPS cap.
Blank and image screensavers auto-cap at 2fps since they have no
animation, reducing CPU usage to near zero.
- introduce Color struct to reduce argument count in canvas drawing functions
- remove unused write_to method
- use is_multiple_of() per clippy suggestion