Add fancier developer-save option to make it easier to export from Android.

Firefox/Android as a web-app doesn't seem to do anything useful with the
plain-text JSON download from the previous 'save' command.  You can't even
cut-and-paste it into an email.  Export as an encoded PNG instead, which
you should be able to save and send from Android.  Add a scripts to
uncompress and decode the resulting PNG as well.  Note that I attempted
to make the encoding well-behaved on retina devices, but I don't provide
any guarantees on the decoding end.
hammer.js improvements: 'hover' class; prevent click and contextmenu events.

The 'apply_hover' option will now apply a 'hover' class to the element as
soon as it is touched, removing it when the touch is released.

We also cancelDefault for click and contextmenu events when the
prevent_default option is used.
Factor out the noDefault() event handler helper method from brushdialog.js.
Use 'click' event on <a> elements instead of hammer.js in general.

Better user experience on Android (tactile feedback).  Be sure to cancel
the 'contextmenu' event, though!
Some appearance work on the gallery; allow icons to be dragged.

The original goal here was to have the icons be dragged to the trashcan
in the toolbar to be deleted, but iframe issues make that difficult:
mousemove events stop as soon as the mouse moves over the toolbar
(although touchmove events continue just fine).  So we'll probably
revert some of this patch and implement some form of 'long tap to delete'
instead.
Drag and drop support for gallery thumbnails.

This was incredibly painful.  There are three different methods implemented:
 a) standard HTML5 Drag and Drop.  Works great, really easy to implement,
    doesn't work on mobile browsers (boo).
 b) touch events: touch occurs on element in inner iframe and touchmove
    events follow the gesture even when it leaves the iframe (good) but
    we need to element an overlay in the toolbar layer in order to get
    the drag shadow from being clipped in the iframe.
    but the drag shadow needs to be 'pointer-events: none' otherwise the
    touch events get interrupted.
 c) mouse events: mouse move events get interrupted when you hit the edge
    of the iframe (boo).  but we can get mouseover events (which don't
    exist for touch).  So as soon as we mouseover an element, move the
    drag shadow over it, so we can intercept events and handle the
    mousedown/mousemove directly on the drag shadow.

It all works (finally) but it's a bit ridiculous.  Probably method (c) could
have been eliminated, since browsers-with-mice tend to implement method (a)
(which is better, since it's not limited by the edges of the browser frame).
However, implementing (c) helped a lot with implementation and testing of (b),
which was the only one I *really* needed.  Sigh.
Implement actual deletion of drawings.
Fixes to gallery drag & drop and deletion.

Add ontap handler for touch platforms; fix classnames to be valid CSS
(must start with _a-zA-Z); tweak appearance of trash can; handle
'trashButton' message.
Use 'alphabetic' baseline for font metrics.

Firefox and Chrome disagree about where the 'middle' baseline is for
canvas text.  (sigh.)
Update TODO list.