Mitigate the impact of require list expansion on code size by filtering using expanded layer dependencies

Require list expansion is an effective technique for reducing HTTP requests caused by dependency discovery as modules are loaded, but it has the downside of increasing the size of the code somewhat.  The aggregator already addresses this by filtering the expanded require list using the expanded dependencies of the containing modules, plus any scoped require lists.  This change further reduces the impact of require list expansion on code size by filtering the expanded require list using the expanded dependencies of all the modules in the layer that the module belongs to.

A new interface, ILayerListener specifies an OSGi service interface that is called by the layer builder for layer events (BEGIN_LAYER, BEGIN_MODULE, END_LAYER).  The JavaScriptModuleBuilder registers a layer listener and calculates the expanded dependencies for all the modules in the layer during BEGIN_LAYER notification and saves the expanded layer dependencies in a request attribute.

A new interface, IModuleRenderer allows module builders to render a module build at layer assembly time.  The javascript module renderer filters the expanded dependencies for require calls in the module with the expanded dependencies for the layer that were calculated by the layer listener.

The javascript module renderer encapsulates the compiled module and the expanded dependencies that were determined by the module builder in a way that allows it to quickly and efficiently replace the expanded dependency list that with the filtered dependency list in the rendered output.