[DO NOT MERGE] Implement Stash API.

Based on https://github.com/libgit2/libgit2/pull/2705

Not in master yet, adding so I can test locally.
in #865 you raised an interesting point.

I'm wondering if it might be interesting to create extension methods for both `Pop()` and `Apply()` which would accept a `Stash` instance. In these one, we would first lookup the `Commit` matching the passed in canonical name and check that the parents of the retrieved commit match the `Base`, `WorkTree` and `Index` ids of the passed in instance.

When they don't match, we may raise an `InvalidSpecificationException` with a meaningful message explaining that the stash depot has been modified since the passed in instance has been created.

Thoughts?