use CDOSounds from BlocklyApps if Blockly not available

* extend CDOSounds to support options.volume and options.loop, add Sounds.stopLoopingAudio() and Sound.stop()
* change all calls to Blockly.loadAudio_() to BlocklyApps.loadAudio()
* in BlocklyApps.loadAudio(), use Blockly if available, else use CDOSounds if available (now passed into BlocklyApps appOptions as cdoSounds and stored as BlocklyApps.cdoSounds)

This is an existing issue, the one odd thing here is the behavior for WebAudio would be slightly different than HTML5.

I *think*—

* Playing a sound twice in WebAudio (as in this line) would play two instances of it.
* Playing a sound twice in HTML5 would play, then restart one instance of it.

That seems OK for now, just worth being aware of. The fix would probably be conditional initializing here `this.playableBuffer = this.playableBuffer || this.newPlayable [...etc]`