a possible technique here could be that a target event listening function receives a collection (or some weak referencing association) that can point it to every ListenerCollection etc. which it is a part of, including some callable that can remove this event from that collection, taking into account whatever wrappers have been applied to it. Any ListenerCollection that receives a new event would make sure this registration takes place. If done consistently, this should account for all the many ways that a listener function gets assigned to many places, across subclasses, copies of dispatchers, etc. and not expose any of that to the removal process.
tentative 0.9 assignment, we'll see if we get to it.