Better Iterable.string for lazy iterables with side effects

The previous implementation would evaluate elements multiple times,
which confused people when they printed the iterable (especially that
the first element was evaluated once more than the other elements for
the emptiness check). This implementation now only evaluates elements
exactly as often as necessary (min { elements.count, 31 }).
Add tests for the new Iterable.string implementation

Tests that it still returns the same string, and that it only evaluates
exactly as many elements as necessary.
Merge pull request #435 from lucaswerkmeister/lazyIterableString

Better Iterable.string for lazy iterables with side effects