Add TargetFactory, and change how time is handled

Targets now have a leadTime property which is used to compute
startTime, relative to displayTime (when the target reaches the
fretboard), instead of having it specified manually.

TimingController no longer has a tempo property, but now has timeScale
and distanceScale properties.

timeScale affects the pace at which time advances as a multiplier for
real time, and distanceScale affects how targets are spaced (how many
units Z per second)

TargetFactory uses the target's displayTime and distanceScale to
determine where in space to place targets, so that they respect their
displayTime.
Adjust fretboard view to be elevated off the track a bit.
Add some optimizations to dispatch() to reduce array iterations
Add ability to go to a specific time, fix bug when calling play when already playing caused position to be reset