wip - integrate with GCS

Add CORS config, update README.

Replace fake datastore with JsonGCS instance, and use google-oauther to
provide a google oauth2 token for datastore requests.

Issue: object initialization. The object doesn't already exist, so we
get a 404 error and the app doesn't start.
Integrate with GCS - data persistence works now

In order to handle object initialization, we upgrade JsonGCS to a
version that allows request error handling. If we encounter an error,
we (maybe wrongly) assume that the error is a 404, because we haven't
created our cloud storage object, yet. We then try to create the object.

Once the object exists and has content, in order to show that content,
we need to redraw the view once it has been fetched. The view was
written under the incorrect assumption that the data would be
immediately available, and even with data, the view was empty.

We provide a callback registration API from the coffee logger
"model" layer, which the view uses to register a redraw function to be
called whenever the coffee logger successfully fetches data from the
datastore.
Add temperature to coffee records

It's interesting to note that it's fine for existing records to be
missing the temperature field. At least, for this use case, which is as
a glorified spreadsheet.