Better timeout handling

Right now, each time we create a timeout or interval within an instance of the player, we must also set up `dispose` listeners to clean up those timers. This PR adds a `setTimeout` and `setInterval` method on the player that behaves exactly the same as those native functions except they automatically add the dispose listener.
We could probably just make this window.clearTimeout instead of this.clearTimeout to simplify the logic here. In the case where this function is run, currently it would clear the timeout and then remove itself from the dispose event. The dispose event should never happen again so the second part isn't needed, but also doesn't hurt anything.