perf(desktop): Pace the bar's attach and the notification cards to a frame period
The floating bar's move to the edge and back stepped on every wake of
the main loop, and the compositor's release of each frame is one: the
bar was drawn as fast as the compositor answered, about 170 frames for
a 220 ms move, each copied into the shared buffer and uploaded by the
compositor. The notification cards' slide and fade drew the same way.
Both now draw a frame no sooner than a frame period after the last
(ui::FRAME), and the main loop is woken when the next one is due; a
change of content is still drawn at once.
geom::coalesce merges overlapping rectangles into the one covering them
where that covers no more pixels. The bar's damage, the area it left and
the area it drew, and each shared buffer's damage missed over several
frames are coalesced before they are copied, so a frame of the move
copies its band once rather than six times, and a buffer that missed a
run of frames no longer falls back to copying the whole surface.