Various improvements

Sorry about the big pull request. This improves several parts of the API:

* Separate caching strategy (Cache) from storage (Redis, Memory)
* Customizable async functions for public and private cache keys
* Default public key function
* Allow overriding of the TTL with a function

This breaks the API, but since only a few people are using this module yet I think that's ok. Let me know if you're ok with these changes and I can merge it myself and publish a new release (bumping the minor version).

/cc @missinglink