group_into_verses() splits LRC lyrics on empty lines or timestamp gaps
>3.5s; find_active_verse() returns the current verse lines and active
index with INTER_VERSE_CAP (8s) cap on the last line of each verse.
ControlState.set_lyrics() now pre-computes verses; current() exposes
verse_lines and verse_active instead of the old 5-line lyric_context.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
current() now finds the active lyric in a non-empty-only display list
and returns a lyric_context array: [{text, offset}] for offsets -2..+2
centered on the active line. lyric_line kept for backwards compat.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>