ensure retaining an asynchronous object until it has been downloaded

NOTE: the actual implementation just over-retains it and releases the extra retain count
once it is being evicted. This logic could be improved and just retain it until it's downloaded
(and not more)
fixed two minor leaks
fixed some more memory leaks introduced with the non-blocking interface