Good point. Currently all calls to listener are synchronized around the same lock - it's part of the contract to make the listener's life easy (e.g. counting timeouts) and also ensuring correct reporting of sequences of events in the ActivityTimeMonitor. 
Life could get complex if I move it outside of the lock - maybe I should just add a warning about listener implementations for now.