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.
 
I don't think we should wait until the request completes for this. Unfortunately, that means that something else might need to be undone if the request fails.