Fix websocket client fingerprint/userId calculation.

Websocket clients' userIds were being copied directly from their
fingerprints, rather than being calculated as a combination of
fingerprint and IP address (like the web clients). This is fine if
we assume that a client will be only a websocket client or only an
HTTP client, but this is not actually the case (see: mobile
clients).

This fix determines the IP of websockets when they connect, then
performs the same calculation as for HTTP clients on each message.

NOTE: This will cause a fingerprint change for clients that are
using websockets, so if they were muted they will become unmuted.
This will also cause the previously "readable" bot fingerprints
(e.g. meatmonsters) to become unreadable, although they will still
be unique per bot as long as different fingerprints are still
given.