Be more like Q

While reading up on exception handling, I realized that Q calls our `finalize()` method `done()` instead.  It also has support for `catch()` (sugar to only specify an error handler) and `finally()`, a way of specifying a callback which will get run whether the promise is resolved or rejected.

I've felt the need for both of these when using Promises, so this PR adds support for them.