Introduce a model to abstract SCM service integration

[finishes #80208778]
If you made:
```ruby
described_class.find_or_create_default_for(user)
```
a named subject of this describe, like:
```ruby
subject(:find_or_create) { described_class.find_or_create_default_for(user) }
```
you can probably delete a lot of text. In cases where you are testing its value, you can shorted it to:
```ruby
it { should be_a(GithubTemplateRepoProvider) }
```
and in cases where you are wrapping it in an `expect` block, because it's named you can:
```ruby
it 'does not add a new provider to the user template_repo_providers collection' do
  expect { find_or_create }.not_to change{ user.template_repo_providers.count }
end
```