TLV parsing can now happen without a concrete TLV structure to
follow. Structures are parsed into dictionaries and list/arrays are
into Python lists. They can't be reencoded this way! It is assumed
they will be used to create a more concrete object via `.from_value`
This handles the variable argument structures by allowing calling
code to make them concrete once they determine the type.
tlv.List is now a container superclass like tlv.Structure. It
allows for Structure like attribute access but preserves order
and duplicate keys (which may be unused).
Commands are now supported by subclassing the data model cluster
and overriding the class level Command() object. It stores input
and output type info.
This makes those struct fields show up as `int` when you hover them in
your editor. And will give red squiglies when assiging values with the
wrong type.
Makes things like this give a type error:
```
class NullTest(tlv.TLVStructure):
n = tlv.BoolMember(None, nullable=True)
notn = tlv.BoolMember(None, nullable=False)
s = NullTest()
s.n = None # checks ok
s.notn = None # doesn't type check
```