CacheProxy refactored, cleaned up

* CacheProxy refactored into three classes. 
* CacheProxy related checkstyle issues fixed. 
* Code duplicates removed.
* LoadAll async behavior is fixed.
* ICache doc improved
* ICache API addition, two async methods
Why allow this method to be called with a null listener? If the method is lenient towards null argument, then I would check the argument as the first statement in this method and exit the method immediately. Also simplify the branching since you get less deep branching.