Undo Feature

**WIP**. This implements undo by preventing the last action in the sync queue from pushing until either (a) new op pushed to queue, (b) 10s timeout, (c) window.onbeforeunload. See https://github.com/HabitRPG/habitrpg/tree/undo

I've played around with it and I think it's a simple & elegant approach, but it's definitely hitting some bugs. Likely need to shuffle around some stuff in userServices.js. Not ready for merge, I'll probably do some fixes / force-pushes, but @colegleason wanted to bounce this approach off you