Use promiseFor in `deferred.resolve`.
Make `deferred.progress` symmetric with `.resolve` and `.reject`.
Ensure that the progress promise isn't leaked.