Allow custom cache providers

I've created a CacheProvider interface and a CacheProviderLruCache so that the default is still the same LruCache. This allows users to create their own custom CacheProviders or turn off caching by using the supplied CacheProviderNoCache.