Accessing `Repository.Submodules[string]` returns a new instance of `Submodule` each time it is accessed. Most of the time, the client is only interested in the latest instance. However, in the current implementation, we are keeping a reference to the handle until the repository is disposed.
If we don't pass the handle, we don't have to keep a reference to it

Another reason is that I think `Submodule` should be immutable, like the other objects returned by LibGit2Sharp. The way it is currently done in the rest of the codebase is through the use of `Lazy`/`GitObjectLazyGroup` utility classes.
I make a parallel with `Commit`: we keep an instance of `ObjectId`, and rebuild a new instance of `ObjectSafeWrapper` (which in turns calls `Proxy.git_object_lookup()`) when we first access each property. 
I think we can do the same with `Submodule`: instead of keeping an instance of `ObjectId` we can keep an instance of the `name`, and rebuild an xxxxWrapper (which will call `Proxy.git_submodule_lookup()`).

Also, slightly related: I wouldn't keep the `Stage()` method in the `Submodule` class. As this method acts on the superproject, I think what you did in `Repository.Index` is actually enough (although we would have to move the call to `Proxy.git_submodule_add_to_index()` there) => this is one less reason to keep the handle in `Submodule` I guess.