Hierarchical event emitter with promise