add factory for creating events, and let listeners submit commands to execute before subsequent listeners get called