Initial implementation of the Object API.
Initial implementation of the Object API.

* The `tree/show/:user/:repo/:tree_sha` call returns an array of objects in
the given tree. This is exposed by the FileObject class. The name is
convoluted because Object is a reserved word. 'Tree' is awkward because
although the argument describes a tree, the returned objects aren't trees...
We should probably call this Tree, and have it return an array of FileObject
objects...
* The `blob/show/:user/:repo/:tree_sha/:path` call is supported by
Blob.find(user, repo, sha, path).
* The `blob/show/:user/:repo/:sha` call returns raw Git data irrespective of
caller's format preference. To handle this a get_raw method has been defined
which simply requests a given path and returns the raw body without attempting
to coerce it into a data structure. The right way to handle this is to format
based on the Content-Type header in the response, but that is always set to
text/html, so is useless. Blob.find(user, repo, sha) returns said raw data.
* The .find method is now intelligent about arrays. If yaml[key] is an array,
each element is assumed to be a hash constituting a new object. I still don't
claim to understand all the magic of this module, so this enchantment may very
well be unnecessary, but it enabled some hairy code to be factored out, so it
stays for now.
* The .find_all method now accepts a block, to which it passes the data it
intends to construct a new object with. This is to allow callers to massage
an arbitrary data structure into a simple hash. This is used for Tag.find
because GitHub returns a single hash of tags, rather than one hash per tag.

(Yes, I realise that this is a ridiculously long commit, and, yes, I have
heard of cherry-pick...)

fcoury/octopi,fcoury/octopi,fcoury/octopi