make sure errors are returned through the callback instead of thrown; use bluebird instead of async