Extract upgrade steps worker

Make the upgrade steps worker code more testable by ripping it out of the machine agent. Take advantage of this to make the upgrade tests significantly simpler and faster.

This is all in preparation for further changes around state agent synchronisation during upgrades.


FWIW, LimitLoginsDuringUpgrade and upgradeWaiterWorker use this and might themselves want to migrate away from the agent.