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.
No, it's not the function that shouldn't be allowed to return a null - it's the new SPI method(s) you introduced, e.g. `bulkComputeIfAbsent`. This method isn't actually a straight pass-through of the return value of the function; the latter is merely used to fill in the blanks in this case, and in fact the on heap implementation of the SPI method _never_ returns a null (but may in fact return an empty map).