Introduce a model to abstract SCM service integration

[finishes #80208778]
Should this memoize the results? I could see a template calling the `#username` method a couple of times and accidentally making several API calls.