Also, fix for multiple quotes. Without a closing quote subsequent quotes are considered nested, and
will use a ‘ instead of “
Also, move repeated elements to partials
It is strictly a superset of the change event we were using
before: if there's a change, there will be always a cursor
update, but there can be cursor updates (like when the user
presses the arrow keys) that don't change the document.
This is coherent with what we do to track user activity at
dfb9943521/public/coffee/ide/connection/ConnectionManager.coffee (L49-L50)
We send the first heartbeat as soon as the session start.
The next ones are sent (if there's any activity)
when the editing session is about 30 and 60 seconds.
Then at 2min, 3min, 4min, 5min and later on every 5min.
The backoff is not reset, so if due to inactivity the
session expires in the server the backoff will still be
the same.
Throttle sends an event as soon as the function is called. Then
we wait X minutes, but we only want to send another event if
there's any activity *after* those X minutes.