timedMediaPlayerView: clean onPlaybackTick flow

since a layer of abstraction will be added between checking if playback
is too early or too late, consider playback to be in range only if
playback is neither judged too early or too late.
timedMediaPlayer: decompose playback early/late

this allows child views to override and augment judgments about playback
being before or after start
tests: simplify onPlaybackTick tests

take advantage of `_playbackIsBeforeStart` and `_playbackIsAfterEnd` to
test `onPlaybackTick` more granularly
youtubeShell: track ytPlayer state

youtube stops the video shortly before playback reaches the end of the
duration. in order to detect when an unclipped youtube video has ended,
listen to youtube stateChange events and track whether the youtube
player is in the ended state