Bug 865256 - Part 3a: Add AudioBufferPeakValue utility. r=ehsan, a=lsblakk

This is an equivalent, C-only implementation of blink's
VectorMath::maxmgv or Apple's vDSP_maxmgv. It finds the
maximum absolute value of the elements in a float buffer.
Used by blink's PeriodicWave implementation for normalization.
Bug 865256 - Part 3b: Add a complex->real ifft to FFTBlock. r=ehsan, a=lsblakk

Currently FFTBlock only holds the complex frequency domain data
internally, reading and writing to external time domain data
buffers. For PeriodicWave we need to create a real, time domain
signal from real and imaginary frequency domain data. This method
does this without touching the internal output buffer at all.
FFTBlock is just used as a wrapper for kiss_fft_cfg.
Bug 865256 - Part 3c: Import blink's PeriodicWave. r=ehsan, a=lsblakk

This is the original code from blink svn trunk r157670 for reference.
This commit has no porting or build support, to make subsequent changes
easier to identify.
Bug 865256 - Part 3d: Port blink's PeriodicWave to gecko. r=ehsan, a=lsblakk

Changes to use gecko infrastructure.
Bug 865256 - Part 4: Implement custom waveforms. r=ehsan,padenot; a=lsblakk

Copy the periodicWave data into a shareable buffer.

Add a SetBuffer call to send the buffer data to the
OscillatorNodeEngine. Call into blink's PeriodicWave
implementation to generate bandlimited tables bracketing
the desired frequency and interpolate the output data
from them.

Change the PeriodicWave constructor to only take one
length, since both arrays must be the same size.

Change OscillatorNode's SetType to throw INVALID_STATE
instead of NOT_IMPLEMENTED if js tries to assign
type = 'custom' directly.