2.0.0 promises

We discussed moving from returning an event emitter to returning a promise.  This implements the change.

Since future versions of node.js (and indeed all JavaScript environments) are going to have promises built in, this attempts to use built in promises if available, then falls back to requiring 'promise' as a polyfill.