Fix removal during dispatch

This fixes the case where a change listener is removed during dispatch.
All listeners that existed at the beginning of change dispatch except
those that have been since removed are notified, but any listeners added
after the dispatch began are ignored.

Alternative to #46