WIP undoable server updates.

@gwprice FYI.  implements a utility around safeAjax that can be used to revert client-side model updates in the event of ajax request failures.

glaringly absent here is any handling of conflicts arising from concurrent updates - this doesn't really make the situation any worse than before IMO, it's just that the state of data after a conflict will be a different flavor of undefined.  AFAIK there's only one way in the UI to trigger any of the involved updates, so as long as we judiciously disable controls while events are inflight, things should be reasonably airtight.

jasmine tests are not passing on this commit, but neither are they on the previous one - so figured we'd sort that commit out first.
 
we can change the semantic of "comment:endorse" to mean "endorsement state has changed" and then call it both before ajax and after (using `always()` instead of `done()`).