async emit(eventName, ...args) {
    assertEventName(eventName, this[EVENT_NAMES]);

    const event = new Event(eventName);

    for (const listener of this.listeners(eventName)) {
      await listener(...args, event);

      if (event.shouldStopPropagating) {
        return false;
      }
    }

    return true;
  }
Asynchronously calls each of the `listeners` registered for the event named
`eventName`, in the order they were registered, passing the supplied
arguments to each.

Returns a promise that will resolve to `false` if a listener stopped
propagation, `true` otherwise.

@async
@param {String} eventName - The name of the event
@param {any} ...args - The arguments to pass to the listeners
@returns {Promise<Boolean>}