Audio updates

This is an update to how audio is handled:
* Moved the audio context out of each brick and into the app itself
* Bricks now use the app's audio context (if each brick uses their own, we'll run into limits)
* Added load sound and play sound methods to the ceci element base so each brick can just make two simple calls now
* Ported over the button and auidio components to this new style

Fixes #1972


volume 0, if the clip is muted, will coerce to false, so the clip'll suddenly play at max volume. There's a few ways to make it aware of 0: `volume = (typeof volume === "undefined") ? 1 : volume;`, `volume = (volume!=""+volume)? 1 : volume;` or even `volume = isNan(parseFloat(volume)) ? 1 : volume`. Latter is probably the most semantically correct.