Rewrite update algorithm to be restartable and extensible.

This change breaks the update algorithm into a series of
discrete Steps which are run in order. All the state produced
by the Steps is serialized so that it is possible to restart
the update if it fails at any point. This is good to have when
interacting with the external environment since external operations
can fail (e.g. GitHub can be down).

A further goal (and more concrete use case for the restartability) is
enabling the update process to be extended. In particular this enables
Mozilla-specific extensions for upstreaming local patches. Since these
patches may conflict with upstream it's necessary to allow for manual
fixups during the upstreaming process. Being able to restart and
continue the update is part of this.