Resume re-arms a pipeline whose ffmpeg pass was killed at pause, so the
pre-pause bars are stale until fresh frames flow. Three changes:
- resumeVisualization always sets the loading state (previously only for
positions outside decoded coverage) and records the resume point;
renderFrame clears it only once the position clock advances past that
point — a player still re-buffering after a long pause keeps the
spinner instead of serving static cached bars.
- stopVisualization clears barData so cold restarts (unload, disable,
episode change) show the spinner rather than stale bars, and never
suppress it.
- renderFrame detects a frozen position clock while playing (STALL_DETECT_MS)
and surfaces it as a loading state; recovery clears it.
Tests: resume-into-undecoded-audio shows loading until bars land; frozen
position clock surfaces a stall and recovery clears it; disable/enable
pins barData cleared on stop and the restart loading flash.