Remove redundant timezone from individual update timestamps.

The time separators make the timezone clear and it's redundant
information on every update.
Use absolute times for timestamps older than a day.

"2 days ago" repeated twenty times isn't super helpful.
Rename border image to blow away caching.
Style visitor count to look more natural in status bar.
Rework permissions for closed events.

Mutating existing content should still be possible after closing an
event, we just don't want new updates to be posted. Instead of checking
for the event state in validators, instead we check event state at
permission generation time and revoke "update" permissions in that case.
Remove redundant body class.

Look again: Your liveupdate event embeds are now styled.
Fix encoding of title in "start a discussion" link.

This fixes a crash when the title includes non-ASCII characters.
WebSocket: Add client-side support for new-style update messages.

Step one of a live migration to a new format for update messages.
WebSocket: start sending new-style update messages.

These include more metadata rather than just the pre-rendered update.
WebSocket: remove compatibility code for old-style update messages.
Add support for optional desktop notifications of new updates.
Factor unread item counter out into its own class.
Factor activity tracking pixel stuff out to its own class.
Factor socket status message out to its own class.
Move refresh message handler to core code.

This is something we'll want any/all websocket clients to be able to do
and is especially relevant with changes to Sutro that allow broadcasts
to wider namespaces.
Factor out listing scroll code to its own class.
.