WIP
Add a reminder to remove code that is only there to support legacy code, once said legacy code has been removed.
Use the list class directly (since calling list() returns a new empty list) rather than a lambda--turns out lambdas will create problems for pickling)
Carrying over partial work from my parameter internals refactoring--this converts the values in Model._param_metrics to a dict rather than a tuple for easier understanding of the code (maybe at some point a namedtuple?) and merged the _param_broadcast_shape attribute into _param_metrics (no reason they should be separate)
Fix how submodules are returned when indexing a compound model instance--ensure that regardless of whether the compound model's template used model classes or instances a *new* model instance is returned whose parameters are linked to the compound model's parameters.  This was done for now by changing Model._from_existing to a sharedmethod.