introduced caching, locking and more detailled throttle

- moved cache evaluation into separate components
- started to move storage handling to a separate component
- removed defaults for ttl, since this now handled by reading response headers --> or overwritten per request
- parsing url on every request, since this is now used for caching and throttling
- changed response-serialization to ignore set-cookie header
- moved creation of redisClient out of the requestor constructor --> will be used in multiple places for pub-sub when unlocking pending requests
- some basic statistic collections for received requests, cache-misses, servedFromCache
- limiter will now provide remaining = -1 when there are no remaining requests in the current bucket (was 0 previously)
- multiple ways to bypass caching (either for receiving, or storing or both)
- publishing a "not-storable" message when a received response is not storable --> this is used to tell "queued" requests to re-issue their call with telling requestor to ignore cache completely (since the response is not storable anyway)
- some cleanup with cache-keys
- requests are now hashed using xxhash --> amazing library to do high-performance string hashing
- using a redis transaction to decr the remaining counter on every bucket request --> previously there was a way to trick out of the bucket limit when starting enough requests in parallel
- cache evaluator uses Array.some to iterate over request and response validators. The first one that sets either a request or a response to be receivable / storable will abort iteration over the others since this is a final setting per request