Reduce dependencies on `hooks` and wrap hooked methods in a Promise

I refactored out the use of hooks to validate the model (and SubDocuments) into a promise, so this goes to help towards Issue #1446.
Only side effect of refactoring out the hooks is that now the "pre save validation" is a bit more thorough as reflected in  the one changed test.