Smooth trainer movements

Sometimes 'move' events come faster than the movement interval. Solve
the problem by queueing movements, and applying a movement when ready.
Hooked into update() to accomplish. Dirty position concept replaced with
queue emptiness.