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

- Make PBKDF2 optional, but the default
- Implement bcrypt
- Allow bcryptjs for users that are on windows
- 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

- Change User schema from hashedPassword to password
- Remove unnecessary virtual attribute User.password, getters and setters are not async