Support more kinds of Git data

Improvements to refs, commits, trees, and blobs.

Doing this work has kinda frustrated me with the inconsistencies in the APIs we're using (like different input structure for GETing a ref versus PATCHing it, or fetching a ref vs. fetching its tree directly). I'm wondering if there's some deeper refactoring that can be done here.

**To do:**

 - [x] Get a commit by SHA
 - [x] Create a commit
 - [x] Create a blob