We need this in order to update the MediaStreamGraph thread when an
AudioParam changes. This enables each AudioParam to be registered with
a callback from its owner node, so that the owner node can have custom
processing code for each AudioParam's mutation.
This patch implements most of the semantics of AudioParam in a
templatized base class called AudioEventTimeline. This is done in order
to make it possible to test this code from C++ without the need of
linking to libxul. Basically we take everything that could depend on
libxul or is not suitable for a genertic implementation and put it in a
traits like type as a template argument. Then the test creates mock
objects that conform to the argument interfaces, and tests the logic of
AudioEventTimeline.