Introduce a model to abstract SCM service integration

[finishes #80208778]
I considered this and wasn't sure.  In the case of the `User.first`, it's okay if the one-and-only user hasn't been created yet.  

However, based on this suggestion I started thinking about the down migration case where a user might exist but not have a provider or api_key, so I'm putting a condition on line 17 in case the `user_default_provider` is `nil`.