Introduce new submodels machinery

This pull request introduces a new machinery to define models. They can be summarized as follows:
1. ty files typically just import a submodel, call the setup() method, if needed change some of the parameters and then instantiate the model by calling the model instance.
2. A deferred instantiation of models is now possible. By calling the setup() method of a submodel, only templates for sheets and projections are created. These templates (SheetRef and ProjectionRef) contain an attribute parameters which is then passed to the actual sheet/projection once the submodel instance is called. SheetRef and ProjectionRef both implement a resolve() method which returns the actual sheet/projection after instantiation. This might be used by Collector.
3. The SheetRef class also has an attribute identifier. This is a dict specifying the sheet more detailed than just the name. E.g. the identifier might be {'eye':'Left','layer':'LGN','polarity':'On'}. The class then overrides the \_\_str\_\_() method to return a string based on this identifier matching the names of sheets which have been used in previous models.
4. The base class for all submodels is SensoryModel. This is an abstract class which provides the structure for the new machinery of setting up models. VisualInputModel is a subclass of SensoryModel, specifying the training patterns of a submodel. EarlyVisionModel is a subclass of VisualInputModel, specifying the retina and LGN sheets. It supports multiple eyes as well as multiple spatial frequency sheets. ColorEarlyVisionModel is a subclass of EarlyVisionModel, and extends it to support color sheets. This class is experimental so far!
5. ModelGCAL is a subclass of ColorEarlyVisionModel (but can be changed without affecting any results to EarlyVisionModel), and specifies V1 according to examples/gcal.ty. Furthermore, it allows multiple lagged projections from LGN sheets to V1 as a motion model.

Submodels lack of more documentation, which will be added soon (see TODO's).

This pull request depends on https://github.com/ioam/topographica/pull/570, https://github.com/ioam/imagen/pull/30 and https://github.com/ioam/featuremapper/pull/10
The idea behind the two-level dictionary was simply that instead of these existing calls to four separate data structures:

    self.match_connectiontype_mapping['Afferent']=projection.SharedWeightCFProjection
    self.match_connectiontype_mapping['AfferentCenter']=projection.SharedWeightCFProjection
    self.match_connectiontype_mapping['AfferentSurround']=projection.SharedWeightCFProjection
    self.match_connectiontype_mapping['AfferentV1Off'+str(l)]=projection.CFProjection
    self.match_connectiontype_mapping['AfferentV1On'+str(l)]=projection.CFProjection
    self.match_connectiontype_mapping['LateralGC']=projection.SharedWeightCFProjection
    self.match_connectiontype_mapping['LateralV1Excitatory']=projection.CFProjection
    self.match_connectiontype_mapping['LateralV1Inhibitory']=projection.CFProjection
    self.match_parameter_mapping['Afferent']=self._specify_lgn_afferent_projection
    self.match_parameter_mapping['AfferentCenter']=self._specify_lgn_afferentcenter_projection
    self.match_parameter_mapping['AfferentSurround']=self._specify_lgn_afferentsurround_projection
    self.match_parameter_mapping['AfferentV1Off'+str(l)]=self._specify_V1afferent_projection
    self.match_parameter_mapping['AfferentV1On'+str(l)]=self._specify_V1afferent_projection
    self.match_parameter_mapping['LateralGC']=self._specify_lateralgc_projection
    self.match_parameter_mapping['LateralV1Excitatory']=self._specify_V1lateralexcitatory_projection
    self.match_parameter_mapping['LateralV1Inhibitory']=self._specify_V1lateralinhibitory_projection
    self.sheet_matchcondition_mapping['LGN']=self._set_lgn_sheets_matchconditions
    self.sheet_matchcondition_mapping['Retina']={}
    self.sheet_matchcondition_mapping['V1']=self._set_V1_sheet_matchconditions
    self.sheet_parameters_mapping['LGN']=self._set_lgn_sheets_parameters
    self.sheet_parameters_mapping['Retina']=self._set_retina_sheets_parameters
    self.sheet_parameters_mapping['V1']=self._set_V1_sheet_parameters

you'd have one data structure named mappings:

    self.mappings['Connectiontype']['Afferent']=projection.SharedWeightCFProjection
    self.mappings['Connectiontype']['AfferentCenter']=projection.SharedWeightCFProjection
    self.mappings['Connectiontype']['AfferentSurround']=projection.SharedWeightCFProjection
    self.mappings['Connectiontype']['AfferentV1Off'+str(l)]=projection.CFProjection
    self.mappings['Connectiontype']['AfferentV1On'+str(l)]=projection.CFProjection
    self.mappings['Connectiontype']['LateralGC']=projection.SharedWeightCFProjection
    self.mappings['Connectiontype']['LateralV1Excitatory']=projection.CFProjection
    self.mappings['Connectiontype']['LateralV1Inhibitory']=projection.CFProjection
    self.mappings['Connections']['Afferent']=self._specify_lgn_afferent_projection
    self.mappings['Connections']['AfferentCenter']=self._specify_lgn_afferentcenter_projection
    self.mappings['Connections']['AfferentSurround']=self._specify_lgn_afferentsurround_projection
    self.mappings['Connections']['AfferentV1Off'+str(l)]=self._specify_V1afferent_projection
    self.mappings['Connections']['AfferentV1On'+str(l)]=self._specify_V1afferent_projection
    self.mappings['Connections']['LateralGC']=self._specify_lateralgc_projection
    self.mappings['Connections']['LateralV1Excitatory']=self._specify_V1lateralexcitatory_projection
    self.mappings['Connections']['LateralV1Inhibitory']=self._specify_V1lateralinhibitory_projection
    self.mappings['Matchconditions']['LGN']=self._set_lgn_sheets_matchconditions
    self.mappings['Matchconditions']['Retina']={}
    self.mappings['Matchconditions']['V1']=self._set_V1_sheet_matchconditions
    self.mappings['Sheets']['LGN']=self._set_lgn_sheets_parameters
    self.mappings['Sheets']['Retina']=self._set_retina_sheets_parameters
    self.mappings['Sheets']['V1']=self._set_V1_sheet_parameters

If this is an AttrTree it would presumably be a bit simpler in syntax:

    self.mappings.Connectiontype.Afferent = projection.SharedWeightCFProjection
    self.mappings.Connectiontype.AfferentCenter = projection.SharedWeightCFProjection
    self.mappings.Connectiontype.AfferentSurround = projection.SharedWeightCFProjection
    self.mappings.Connectiontype['AfferentV1Off'+str(l)] = projection.CFProjection
    self.mappings.Connectiontype['AfferentV1On'+str(l)] = projection.CFProjection
    self.mappings.Connectiontype.LateralGC = projection.SharedWeightCFProjection
    self.mappings.Connectiontype.LateralV1Excitatory = projection.CFProjection
    self.mappings.Connectiontype.LateralV1Inhibitory = projection.CFProjection
    self.mappings.Connections.Afferent = self._specify_lgn_afferent_projection
    self.mappings.Connections.AfferentCenter = self._specify_lgn_afferentcenter_projection
    self.mappings.Connections.AfferentSurround = self._specify_lgn_afferentsurround_projection
    self.mappings.Connections['AfferentV1Off'+str(l)] = self._specify_V1afferent_projection
    self.mappings.Connections['AfferentV1On'+str(l)] = self._specify_V1afferent_projection
    self.mappings.Connections.LateralGC = self._specify_lateralgc_projection
    self.mappings.Connections.LateralV1Excitatory = self._specify_V1lateralexcitatory_projection
    self.mappings.Connections.LateralV1Inhibitory = self._specify_V1lateralinhibitory_projection
    self.mappings.Matchconditions.LGN = self._set_lgn_sheets_matchconditions
    self.mappings.Matchconditions.Retina = {}
    self.mappings.Matchconditions.V1 = self._set_V1_sheet_matchconditions
    self.mappings.Sheets.LGN = self._set_lgn_sheets_parameters
    self.mappings.Sheets.Retina = self._set_retina_sheets_parameters
    self.mappings.Sheets.V1 = self._set_V1_sheet_parameters

Having one data structure encourages the code to be the same for each, and lets you share code wherever it makes sense.  You can still do special cases, but they stand out more when there's just one shared structure.