datastore: support deferred results. fixes #77.

I thought I'd take a stab at #77. If a response from a `dataset.get` comes back with deferred keys, this will recursively call .get again, only executing the callback passed to the initial .get once, after having gathered all possible results.
We should rather tell the user there was an error while fetching these keys. Otherwise, we may be trying to `get` indefinitely until the backend problem is resolved.