Overhaul for website security/authentication

- Password hashing with SHA-256 using PBKDF2_HMAC for key extension instead of single iteration MD5 (lol..)
- Better password recovery with randomly generated keys, instead of using Python's built in hash function (which is completely unsuitable for cryptographic use), by storing the keys in the database
- More to come (this is not yet finished)
Can you factor the conditional out into a helper function, and also use that in `set_password`? So have something like `if helper(password):`. This will simplify slightly (no longer will need that long comment here, and will separate the functionality), and will allow us to easily add more safeguarding than this in the future.