Introduce a model to abstract SCM service integration

[finishes #80208778]
I wonder if you should use the `!` version of a bunch of these methods? You're assuming that these will just work, and so using the noisy version of the method will at least give our users an exception immediately upon migrating that they might be able to send to us in an issue if something went wrong?

Then again I have no idea how Panamax upgrades work and whether those errors would be visible to them.