Split the userjoin code into two classes

The class in core/ is responsible for joining a user into a session and
keeping track of the request, while the class in commands/ is
responsible for triggering it at the right time and the user interface.
Hide local chat when only the local user has joined