Make the example less confusing.

The sorting of the set before printing was necessary to stabilize
doctest output, so using lists in this example is cleaner.
Make the examples a bit more useful.
Add optional `chunk_size` argument.

This allows us to emit side effect for chunks.  This is useful because you can still process the result as a continuous stream, making chaining much easier.  It basically saves you from the ceremony of otherwise having to do this:

    >>> iterable = range(100)
    >>> iterable = chunked(iterable, 30)
    >>> iterable = side_effect(do_something_with_chunk, iterable)
    >>> iterable = flatten(iterable)
    >>> list(iterable)
    [0, 1, 2, 3, ..., 99, 100]