Guard against marshaling invalid handle as GitOid

Related: https://bugzilla.xamarin.com/show_bug.cgi?id=11417
Pull repo field up into base LazyGroup<>
Add SubmoduleLazyGroup
Rename rule properties
Submodule.Stage() > SubmoduleCollection.TryStage()
Use LazyGroup