Introduce client-side transport mgr, sync logs

Introduce a client-side manager for socket traffic, "transport", with
handling for updating state on registered state models and collections.

Change all server-side updates to be triggered by backbone model changes
rather than triggered by incoming socket messages.  This facilitates
changing state outside of the socket flow (e.g. in HTTP routes), as well
as enabling simpler grouping of similar state updates.  Make use of our
new `models.BaseModel.registerSubEvents` to replicate sub-collection and
sub-model events on the parent, making it simpler to register for
updates of dynamic child properties.

Add a new room-manager broadcast function, `sync`, which in addition to
broadcasting the message, stores a log of messages with which to catch
up clients who connect with a lag.  On first join, clients transmit a
timestamp representing the last time they had a data update, and the
room-manager now "catches them up" by transmitting all sync-ed messages
since the timestamp.  On each call to `sync`, the log is pruned of
everything older than OP_LOG_AGE (currently 60 seconds).  If a client
joins presenting a timestamp older than that, it's sent a
"stale-state-error", instructed to reload the page.  This should keep
all clients in sync regardless of lag between page load and message
arrival.