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...
I know this is a bit ugly, but shouldn't we actually allocate within the scope of the `try` statement?

```csharp
GitStrArrayManaged array;
try
{
    array = GitStrArrayManaged.BuildFrom(refSpecs.ToArray());
    int res = NativeMethods.git_remote_set_fetch_refspecs(remote, ref array.Array);
    Ensure.ZeroResult(res);
}
finally
{
    array.Dispose();
 }
```

**Note:** From alternate standpoint if the call to `Build()` fails, well... we're pretty much doomed.