Fix threading bug in ReportCollectionFactory

The RemovalListener for a Gauva LoadingCache is run after the lock is dropped,
 so an expired object could be reinserted and re-registered before the removal
 listener could de-register it.

 Use additional data structures to detect this case and prevent the duplicate
 registration and subsequent deregistration.