This commit resolves #60.
Listeners is no longer final. This way if we are calling to add a listener, we can check if we already hold the listenersLock.  If we do, we spend the time to create a new map and copy the listeners.
This keeps the normal code path cheap, the alternative would be to copy the map before we iterate over it (but that pain would happen in every case, not just this rare one).
Because listeners are no longer final, it actually starts as null (and may end as null after they are called), this is to keep memory as free as possible, but does require us to check if the listeners is null or not.
Minor unit test improvement on the ListenerHelper