Expose Cache#cached? as a public method.
Split up source environment syncing and loading
Split up deployment source fetching and loading
Move source fetch to deploy env task

This only needs to be run when environments are being deployed. All
other times there's a chance we'll fetch environments that don't exist
on disk and explode when operating on them.

Ideally this could be fetched one per run, but I can't determine an
elegant solution for this right now.
Add exceptions raised as docs for git command
Add NonexistentCommit exception, Repository base class
Try to be helpful in NonexistentHashError
Remove unneeded metaprogramming