Better sound management

The intention is to encapsulate sound better, so it gets out of the way of the DOM manipulation (at least partly). It should also make it easier to invoke sounds from other chunks of code in a sensible fashion, to build the foundations for encapsulating the hanging man animations better (and being able to improve them).

It also works around a bug with Android Crosswalk where sounds don't loop.

Note that I included smokesignals.js as an extra Bower dependency, to provide for custom event triggering.

Fixes #22