When you copy a collection/map, it iterates over collection. Therefore if anyone modifies the collection while you're copying it you'll get a `ConcurrentModificationException`. This includes if it's a `Collections.synchronizedCollection(origCollection)`, because you have to synchronize for the duration of the iterator.

We don't want to synchronize on that `subscriptions` collection while calling `unsubscribe(s)` (i.e. when calling alien code) as that kind of thing greatly increases the risk of deadlock.

Hence we synchronize only when copying the collection, and then iterate over a safe copy.