Adds SparseConstantValue/Type

Permits efficient storage/retrieval of constant values that apply over specific ranges of the domain.
Improves SparseConstantValue and in-memory vs. persisted *Value alignment

Improves SparseConstantValue class - adds the ability for it to obtain it's values for each Span from other AbstractParameterValue classes

Makes alignment between *Value classes backed by InMemoryStorage (numpy) and PersistedStorage (hdf) classes cleaner by moving the alignment logic into the parameter_values module (_cleanse_value)

Fixes tests accordingly

Adds byte-string values to test_array_value_interop
Minor tweaks to Span and NdSpan

Adds __str__ & __repr__ and tweaks tuplize & from_tuple --> from_iterator
Adds value_encoding support to SparseConstantType
Implements TEMPORAL_AGGREGATION type ComplexCoverage

Implements a complex coverage type (ComplexCoverageType.TEMPORAL_AGGREGATION) that facilitates aggregation of multiple coverages along a temporal domain.

See tests in test_complex_coverage for usage details
Fixes incorrect usage of ParameterDictionary
Implements efficient persistence of SparseConstantValue

Implements a new *Storage class "SparsePersistedStorage" facilitating efficient persistence of SparseConstantValue.

Modifications to SparseConstantValue and test classes as necessary; including adding test_sparse_constant_value_interop
Adds configuration of logging for coverage model tests
Adds __getitem__ support to ParameterDictionary

Added purely for convenience when operating at the command-line.

__setitem__ is NOT allowed - use .add_context instead.