Refactored `seq` to make it trivial to create lazy sequences

If the `seq` constructor is called with just the one thing, we
assume like before that it's an object that is sequencable.
If we get more parameters however, we assume the sequence is
lazy and the first parameter is the initial `head` value, the
second is a function that returns the next value, and the
third is an optional size.

This change *should* also enable `seq` to be compatible with
generators, although I haven't tried it yet. All in due time.