SI-8835 Lazier slice for Iterator

An iterator for slicing that does not drop eagerly.

A series of `take m drop n` that results in nothing taken
will not call the underlying iterator.

Chained invocations do not create intermediate iterators.

Adds eager `drop` to `IterableSplitter`, which overrides `take` and `slice`.

Let `stringOf` handle `ParIterable` so your ScalaCheck labels can be shown truncated, at least during debug.

This PR against 2.12 (because of the change to laziness)
includes the expanded unit test from #4075, but does not
delete the redundant test files.

This is similar to a proposal at #3963: just track drop and take numbers (skip and limit counters) until forced.

There may be a question whether this is worth it, in the space between deprecated views and the collections getting rewritten by multiple parties.

The other question is, if `take` and `drop` and `slice` are defined in terms of a template method, should they be final?

Review by @Ichoran 
Ha, also agree. Checkstyle complains about unnecessary parens in java...  There's also that two sets of parens are needed, `if (c) r else ((x - y) max 0)` because `else (x-y) max 0` also makes you parse it mentally.  My theory was that no parens means "it does what must make sense", but that doesn't mean much if the sense isn't obvious.