fix(chat): Simplify initial join to give the user a randomly generated name on startup.
fix(chat): Make randomly generated username more random.
feat(chat): Implement username validity check.

Also refactored main codebase into separate services to clearly define the role of each piece of code. It should be more testable this way as well.