Issue 47

Added getAll(), putAll() and removeAll() implementations with reader and writer support. The code in the cache layer should be versatile enough so that the store layer has a lot of flexibility on how it wants to load the keys.
I decided to treat the null return value the same as an empty map to have a more robust layer between the cache and the store layers. Strictly speaking I agree with you that the function should never return null but adding that check was cheap so I preferred to stay on the safe side.