RFC: Parametrize iterators based on applicable(length, it.xs); fixes #25

Some iterators wrap other iterators, and the wrapped iterable may or may not have a defined length.  This PR parametrizes the relevant iterator types based on whether or not `length` is defined for the wrapped iterable, and defines `length` for the iterator only when the wrapped array also has a length.

This is most useful for `collect(itr)`, which preallocates an output array if `length` is defined, or grows the output array otherwise.

Cc: @garborg, @ivarne 

Ref: https://github.com/JuliaLang/julia/issues/7429, #25, #27 
`collect(Take{false})` will allocate too big a vector here if `it.xs` ends up shorter than `it.n`. Not sure how to get the best of both world here so long as there's no way to differentiate between infinite-length- and truly-unknown-length- iterables.