Do the caching here.

Also, we need to ask the delegate scorer to score *all* items, not just the requested ones. Alternatively, we can play games with subsets of items:

1. If the requested items (the key domain of `scores`) is a subset of the cached items, use the cache (`scores.set(cachedScores)` will do this)
2. Otherwise, ask the delegate scorer to score the 'new' items (scores.keyDomain() - cachedScores.keyDomain() — `LongUtils` should provide an efficient `setDifference` method), and update the cached scores to the union of the old cache and new cache.

This second method will remove the need to depend on an item DAO.