This implements a Unit Motion Manager components, that handles UnitMotion() calls. It doesn't actually handle UnitMotionFlying, since that doesn't register, and that one has different message subscription anyways, further breaking the interface between both.
The main side effect is optimisation: much fewer messages are being sent, which is good. I think this can reach 1ms/turn decently easily on its own (EDIT > in fact, more on some maps).
It's also a direct requirement for D1490.
The main drawback is that the code is rather ugly -> there's leakiness in the abstraction. UnitMotion really becomes a subset of the motion manager here.
Ideally most of the 'motion' code would be moved to the MotionManager itself, and UnitMotion would become more of an interface, but I've not tried that at the moment - it's not necessary and it keeps the diff lean.