fix: fall back to continuous wl_pointer.axis when axis_discrete never fires
Mouse wheel scrolling didn't work at all on a real Hyprland session,
for both local scrollback and app-forwarded reports, despite
click/motion mouse-tracking working correctly. Root cause: term only
ever acted on wl_pointer.axis_discrete, an assumption ROADMAP.md had
already flagged as unconfirmed against any real compositor (headless
sway + wlrctl structurally can't produce that event) -- and on real
hardware it turned out false for at least one device, which sends
only the continuous axis event, never axis_discrete.
events.odin's pointer_axis_cb/pointer_axis_discrete_cb now accumulate
into per-sequence App fields instead of dispatching immediately;
pointer_frame_cb (previously a no-op) resolves them once
wl_pointer.frame closes the sequence via a new finish_axis_frame:
axis_discrete wins when present (avoids double-scrolling a compositor
that sends both for one notch), otherwise the continuous delta
accumulates into a carry that persists across frames and emits a
notch every time it crosses the conventional "10.0 units = one
notch" threshold (the same convention GTK and other toolkits use for
this fallback).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>