generalize chain to allow any iterable of iterables

I rewrote the chain iterator so that the Chain object stores an iterator of iterators, rather than a vector of iterators. This means that it doesn't force evaluation of the iterator-of-iterators when the chain is created. (I needed this lazy behavior for a project I was working on.)

To do this I changed the constructor for the Chain type (but the interface of lowercase chain is unchanged), and I added chain_from_iterable, named after Python's itertools.chain.from_iterable. If changing the constructor of Chain is bad, I could make this work by making a ChainFromIterable type or something instead.

Product could also be rewritten to be lazy in this way.

hope this is useful.