Implement build caching

Build caching is implemented by downloading a cache tarball from blobstore before starting the build, and uploading the cache directory to blobstore after the build is complete.

Closes #619