Refactor Steps a bit to allow for syncing

Previously, most of the Steps were related to publishing. However, with small
modification they can also be used for performing syncs.

This commit factors the shared code for both sync and publish into a new
PluginStep, and creates a mixin for unit processing.
I'm not sure if this would work, since publish() creates and then deletes the working dir. The create part is OK to attempt multiple times but a sub-step's rmtree may pull the working dir out before the other steps were complete.

We could introduce a cleanup step if needed but that would also require changing the existing plugins that use PublishStep.