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...
Sure. I put it here because it works equally well on both the Native and Managed versions. You can't subclass structs in C#, but if you could, this would be the "base class."