Ensure observers are unregistered from playerItem

This removes the KVO observer PRXPlayer instance from the player's
`playerItem` before it is deallocated. Note that this fix is only a
partial remedy, since the timing of when the observers are registered
leaves a small window during which the `playerItem` may be deallocated
before any KVO registration occurs.
Ensure all observers are finished before dealloc

The `removeTimeObserver:` method does not make any guarantees about
timed observations currently in flight. Therefore, we need to block on
the same queue used by the time observers before finally deallocating
the player they would have been observing.
Small fixes for a few logging statements
Check if `playerTime` message is valid before call

The `PRXPlayerItem` protocol has the `playerTime` method marked as
optional, therefore we should check if the player item actually responds
to this call before using it.