markChatRead(userId: string,at: string): ChatReadState
Moves userId's read marker to at, a message's created_at, on a
chat_read. It never moves back, so a lagging tab can't undo a newer tab's
read. It never passes the newest message, so a timestamp from the future
can't mark messages read before they are sent.