Internal refactor: using EventEmitter for internal message delivery