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


looks like this would set the volume to 0 if it is a number, but less than 0. Maybe:
```
var isNumber = (typeof parseFloat(volume) === "number");
volume = (!isNumber || volume > 1) ? 1 : 0 ;
```