SI-4332 Plugs the gaps in views

These currently result in runtime errors:

    scala> List(1).view.distinct.force
    java.lang.UnsupportedOperationException: SeqView(...).newBuilder

    scala> List(1).view.inits.toList
    java.lang.UnsupportedOperationException: SeqView(...).newBuilder

Two tests are enclosed:

  1. reflect on the views to make any method that returns
     `Repr` is overriden in `*ViewLike`. This guards against
     new additions to the collections API.
  2. exercise the newly added overrides

Some care is needed with `tail`, we must re-override it
in `mutable.IndexedSeqView` to be explicit about the
end point of the slice, because the `IndexedSeqView#Sliced`
defines length in terms of that. (Higher up the chain, it
is just `iterator.size`, that's why `SeqView#tail` just sets
up a slice from `1 to Int.MaxValue`.)

Parallel collections views are not touched, as these are likely
to be deprecated or removed shortly.

Before this change, the test reported the following.
Not all of these methods were buggy. For instance, `sortBy`,
`sortWith` are implemented in terms of `sorted` which
was implemented in `SeqViewLike`. Even in those cases, I have
opted to override the methods in the `ViewLike` to guard
against changes in the base class implementation and to
simplify the rules in the test.

    ======================================================================
    Checking scala.collection.TraversableView
    ======================================================================

    trait TraversableLike
    ----------------------------------------------------------------------
    def filterNot(p: A => Boolean): Repr
    def inits: Iterator[Repr]
    def tails: Iterator[Repr]
    override def tail: Repr

    ======================================================================
    Checking scala.collection.IterableView
    ======================================================================

    trait IterableLike
    ----------------------------------------------------------------------
    def dropRight(n: Int): Repr
    def sliding(size: Int): Iterator[Repr]
    def takeRight(n: Int): Repr

    trait TraversableLike
    ----------------------------------------------------------------------
    def filterNot(p: A => Boolean): Repr
    def inits: Iterator[Repr]
    def tails: Iterator[Repr]
    override def tail: Repr

    ======================================================================
    Checking scala.collection.SeqView
    ======================================================================

    trait IterableLike
    ----------------------------------------------------------------------
    def dropRight(n: Int): Repr
    def sliding(size: Int): Iterator[Repr]
    def takeRight(n: Int): Repr

    trait SeqLike
    ----------------------------------------------------------------------
    def combinations(n: Int): Iterator[Repr]
    def distinct: Repr
    def permutations: Iterator[Repr]
    def sortBy[B](f: A => B)(implicit ord: scala.math.Ordering[B]): Repr
    def sortWith(lt: (A, A) => Boolean): Repr

    trait TraversableLike
    ----------------------------------------------------------------------
    def filterNot(p: A => Boolean): Repr
    def inits: Iterator[Repr]
    def tails: Iterator[Repr]
    override def tail: Repr

    ======================================================================
    Checking scala.collection.mutable.IndexedSeqView
    ======================================================================

    trait IndexedSeqOptimized
    ----------------------------------------------------------------------
    override def dropRight(n: Int): Repr
    override def tail: Repr
    override def takeRight(n: Int): Repr

    trait IterableLike
    ----------------------------------------------------------------------
    def sliding(size: Int): Iterator[Repr]

    trait SeqLike
    ----------------------------------------------------------------------
    def combinations(n: Int): Iterator[Repr]
    def distinct: Repr
    def permutations: Iterator[Repr]
    def sortBy[B](f: A => B)(implicit ord: scala.math.Ordering[B]): Repr
    def sortWith(lt: (A, A) => Boolean): Repr

    trait TraversableLike
    ----------------------------------------------------------------------
    def filterNot(p: A => Boolean): Repr
    def inits: Iterator[Repr]
    def tails: Iterator[Repr]

    ======================================================================
    Checking scala.collection.immutable.StreamView
    ======================================================================

    trait IterableLike
    ----------------------------------------------------------------------
    def dropRight(n: Int): Repr
    def sliding(size: Int): Iterator[Repr]
    def takeRight(n: Int): Repr

    trait SeqLike
    ----------------------------------------------------------------------
    def combinations(n: Int): Iterator[Repr]
    def distinct: Repr
    def permutations: Iterator[Repr]
    def sortBy[B](f: A => B)(implicit ord: scala.math.Ordering[B]): Repr
    def sortWith(lt: (A, A) => Boolean): Repr

    trait TraversableLike
    ----------------------------------------------------------------------
    def filterNot(p: A => Boolean): Repr
    def inits: Iterator[Repr]
    def tails: Iterator[Repr]
    override def tail: Repr
Merge pull request #3192 from retronym/ticket/4332

SI-4332 Plugs the gaps in views