[backport] Fix unsafe array opt. / opt. primitive Array(...)

SI-6611, SI-6247 (partial fix)

The original commits on master were a bit circuitous, this
is squashed to a neat little package.

I had to add type arguments to the Array.apply calls in the
test case, they are inferred on master.

commit 41ff05dfdbcf032157b3509ace633f2e7a12295c
Author: Jason Zaugg <jzaugg@gmail.com>
Date:   Sun Nov 4 14:44:59 2012 +0100

    Refactor guards checking for a particular overload of Array.apply.
    (cherry picked from commit 092345a24c22a821204fb358d33272ae8f7353be)

commit 1e5c942deccaf64f8d57bd8891b912381d7f220a
Author: Jason Zaugg <jzaugg@gmail.com>
Date:   Sun Nov 4 14:17:25 2012 +0100

    Expand optimization of Array(e1, ..., en) to primitive arrays.
    (cherry picked from commit 8265175ecc42293997d59049f430396c77a2b891)

commit ab1bf77e39f2dfeacf3fc107ccb2907a1867f04c
Author: Jason Zaugg <jzaugg@gmail.com>
Date:   Sat Nov 3 13:34:20 2012 +0100

    SI-6611 Tighten up an unsafe array optimization

    The net was cast too wide and was unsafely optimizing away array
    copies.
    (cherry picked from commit dad886659faca4fba2d4937c9bc6780591b02c27)

And also:

Optimize primitive Array(e1, ..., en)

Expands an existing optimization for reference arrays to
apply to primitives, as well.

Fixes one aspect of SI-6247.
(cherry picked from commit cac5a08611f9511ba4d94b99db630404efae190a)

Conflicts:
	src/compiler/scala/tools/nsc/transform/CleanUp.scala

More principled tree copying.

Canonical > home-spun.

Conflicts:
	src/compiler/scala/tools/nsc/transform/CleanUp.scala