Make cache interface asynchronous

This updates the ApiCache interface (the public part at least) to be asynchronous. This allows a distributed cache to be used that can be shared between multiple client instances across multiple servers.

The api data needed when constructing the client is loaded from cache by default (if the cache has it). 'Simple' usage of the client will create a new cache instance every time, so the refs etc. will be up to date in that case. A new method 'refreshApiData' has been added which will fetch new refs and update the cache for new client instances to use (this may be triggered by a prismic webhook for example).