Return a promise rather than an event emitter

[discussed in #1902]