all requests and response are JSON.
all binary payloads are explicitly encoded as base64
within api.py, and decoded back to bytes before leaving api.py.
User-facing code, e.g. bucket.py and bucket_service.py,
should not see base64 wrangling.
New client interface to support async usage.
This commit implements async versions of write() and privateRead(); all other calls fall back to blocking synchronous versions.