Speedup destruction of sheets with too many listeners & broadcasters.

Listeners and broadcasters are M:N relationship.  If you want to
destruct them, you easily end up in O(M*N) situation; where for every
listener, you iterate all broadcasters, to remove that one listener.

To avoid that, announce to the broadcasters that they are going to die, and the
listeners do not have to bother with removing themselves from the broadcaster.
The broadcaster will not broadcast anything after the PrepareForDesctruction()
call anyway.

Change-Id: I68d78b23e73bcbb944de9139448b2c20dfa14f62
Don't call EndListening() on already destructed listeners.

Change-Id: I9bda35f2246de9d37077dda33c710b89ee008e5a
Make the broadcasting work even when about to destruct.

Change-Id: Idba9302e1ec5234d3d472cda047c09ba52afd328
iterators are not pointers

Change-Id: Ic9809beead66cf0d0e6a6a28bb97b220fb667578
fix crash when erasing entry while iterating through vector

Broadcast might result in calling Remove on the same object which erases
the entry from the listeners vector. If we create a copy we can still
iterate through the vector as all iterators are still valid.