Small specialized sequences.

This pregenerates a pile of classes which look like

  private[scala] final class SpecSeq5Int(
    private[this] val x0: Int,
    private[this] val x1: Int,
    private[this] val x2: Int,
    private[this] val x3: Int,
    private[this] val x4: Int
  ) extends immutable.AbstractIndexedSeq[Int] {
    def length = 5
    def apply(idx: Int): Int = (
      if (idx == 0) x0
      else if (idx == 1) x1
      else if (idx == 2) x2
      else if (idx == 3) x3
      else if (idx == 4) x4
      else throw new IndexOutOfBoundsException(idx.toString)
    )
  }

Then it uses them on varargs calls where possible. This
avoids a lot of array allocation and boxing.  For example,
given these two lines of code:

  def f(xs: Int*) = xs.sum
  def g = f(101, 202, 303)

Here is the bytecode for 'g', before this patch:

   0: aload_0
   1: getstatic     #39
   4: iconst_3
   5: newarray       int
   7: dup
   8: iconst_0
   9: bipush        101
  11: iastore
  12: dup
  13: iconst_1
  14: sipush        202
  17: iastore
  18: dup
  19: iconst_2
  20: sipush        303
  23: iastore
  24: invokevirtual #45  // wrapIntArray
  27: invokevirtual #47  // Method f:(Lscala/collection/Seq;)I
  30: ireturn

Here it is after this patch.

   0: aload_0
   1: new           #36  //scala/collection/immutable/SpecSeq3Int
   4: dup
   5: bipush        101
   7: sipush        202
  10: sipush        303
  13: invokespecial #40 // SpecSeq3Int."<init>":(III)V
  16: invokevirtual #42 // Method f:(Lscala/collection/Seq;)I
  19: ireturn