Chat improvements, including performance improvement.

Use a session variable to track the last read message's timestamp for the
current room.  This lets us put a tight dependency on a single message
for the last read marker (using Session.equals).

Don't update lastRead when simulating newMessage method; this helps maintain
the invariant that lastRead will always exactly match the timestamp of a
message.

Track unread messages (and last read status) on puzzle and round pages that
embed chats, not just on chat pages.

Use sibling selector in CSS to break message followups if the last
read marker intervenes -- or for that matter, if a system message or
action intervenes.  This lets us eliminate some tricksy context code
when computing followups.

Add some (disabled) code to turn off followup formatting in exchange for
much faster rendering: if we return a cursor directly (even a cursor with
a transform method), the spark renderer uses special list handling for
tight dependency tracking and a large performance increase.

Change-Id: Ie4aff5da44b64d3e977b646d38d3da7d48b1c86b