Add non-homogonous list support to schema.py
Add non-homogonous list support to schema.py

Had a common use case of wanting to check against a tuple of schemas,
i.e.

    APPLE = {"apple": int}
    ORANGE = {"orange": str}

    @schema
    def checked(fruits: (APPLE, ORANGE)):
        # ...

which the existing code did not support.  Note that there are a lot of
pitfalls and problems with the current implementation of lists.  The
list code also shares most of its code with the dict code, with very few
changes, which should be refactored.

Pitfalls:
- Nested tuples inside a schema are passed in their entirety to
  isinstance -- you must use a list if you want to check for a tuple.
  This is confusing and not as strict as I want it to be, but I have
  no way around it right now.
  Top-level tuples (schemas that begin with a tuple) are not handled
  this way.
- Custom types that implement Iterable will not be handled as lists
  inside of a schema.  Only instances for which isinstance(instance, list)
  returns True will be treated as a list of further schema elements.
- List schemas are order dependent; they will throw an exception if the
  value does not match the item at the same index in the schema.  For
  the common use case I described above, this seems desirable -- most
  functions I write assume a particular order in that case.  There is
  currently no way to make it order agnostic.

zekna/py-types