git_strarray marshaling improvements

I noticed that `GitStrArrayOut`'s `Dispose` method was implemented incorrectly -- fixing that led me down this path towards trying to unify our `GitStrArray` types and clean things up. We still end up with two different types, `GitStrArrayManaged` and `GitStrArrayNative`, which correspond to the old In and Out types, respectively. But this PR switches to structs, gives a bit more code re-use, fixes some bugs, and manages to eliminate the `UnSafeNativeMethods` class entirely!

I'm eager to get the Mono results...
Yes, I think that since this is a value type, putting the initialization inside of the try block is the best approach. Unlike with a reference type, where you want to avoid potentially dereferencing a null pointer in the case of failed initialization, the value type is always valid.