Your thoughts on using an interface sound like the right approach, assuming you want system/Github/BitBucket to be interchangeable.
The rest of your questions relate to organising your app code, to which there is no 'correct' answer, and you are in the best position to judge this; so do what seems most sensible to you. The only thing I'd say is that if you can forsee wanting to use part of the functionality in another application, or wanting to let other people use it, it might make sense to split that part out into its own module.