Defer getting file contents until needed

This will avoid calling the API to get file contents from GitHub as the
`CommitFile` object is constructed. Also, allows us to avoid getting contents if
file is removed.

* introduce `Commit` class responsible for specific commit