feat(promises): have hooks.runHooks() return a promise