Avoid generic array access in loop in ScalaRuntime
Avoid generic array access in loop in ScalaRuntime

Instead, extends the type-case on the src array to separately
deal with each type of primitive array, which can call into
a specialized variant of the loop.

I've also added a special case for empty arrays.

This compiles as:

```
  // access flags 0x1A
  private final static copy$mCc$sp$1([C)[Ljava/lang/Object;
    // parameter final  src
    ALOAD 0
    ARRAYLENGTH
    ISTORE 1
    ILOAD 1
    ICONST_0
    IF_ICMPNE L0
    GETSTATIC scala/Array$.MODULE$ : Lscala/Array$;
    INVOKEVIRTUAL scala/Array$.emptyObjectArray ()[Ljava/lang/Object;
    ARETURN
   L0
    ILOAD 1
    ANEWARRAY java/lang/Object
    ASTORE 2
    ICONST_0
    ISTORE 3
   L1
    ILOAD 3
    ILOAD 1
    IF_ICMPGE L2
    ALOAD 2
    ILOAD 3
    ALOAD 0
    ILOAD 3
    CALOAD
    INVOKESTATIC scala/runtime/BoxesRunTime.boxToCharacter (C)Ljava/lang/Character;
    AASTORE
    ILOAD 3
    ICONST_1
    IADD
    ISTORE 3
    GOTO L1
   L2
    ALOAD 2
    ARETURN
    MAXSTACK = 4
    MAXLOCALS = 4
```

lrytz/scala,lrytz/scala,scala/scala,lrytz/scala,lrytz/scala,lrytz/scala,lrytz/scala,scala/scala,scala/scala,scala/scala,scala/scala,scala/scala