Migrate the playback system to a reactive model where internalPlayer
is now the complete source of truth for the playback state.
This removes the observer pattern for positions and instead introduces
a new State datatype that allows consumers to reactively calculate
where the position probably is.
This is actually really great for efficiency and state coherency, and
is really what I was trying to aim for with previous (failed) reworks
to the playback system. There's probably some bugs, but way less than
the ground-up rewrites I tried before.
This also lays the groundwork for gapless playback, as the internal
player framework is now completely capable of having more functionality
borged into it.