implement async hooks for factory. Closes #1

Replaces factory `.before()` and `.after()` with `.hook(key, fn)`. 

- `.before()` and `.after()` still work the same but are considered depreciated
- hooks are `pre:build`, `pre:save`, `post:save`
- `*:save` hooks receive the object that was built as the first argument

Closes #1