feat(auth): implement bcrypt and make async for performance

- Implement bcrypt for better security
- Update to be async
- Update tests and add new test for changed password
- User.authenticate() User.makeSalt() and User.encryptPassword() public API remains same
- User.authenticate() User.makeSalt() and User.encryptPassword() callbacks are optional
- User.makeSalt() can take an option rounds to increase salt iterations

- Change User schema from hashedPassword to password
- #474