cmd/gc: evaluate concrete == interface without allocating

Consider an interface value i of type I and concrete value c of type C.

Prior to this CL, i==c was evaluated as
	I(c) == i

As of Go 1.4, all interfaces hold pointers, so evaluating I(c) allocates.

This CL changes the evaluation of i==c to
	x, ok := i.(C); ok && x == c

The new generated code is shorter, uses less stack space,
does not allocate, and makes one runtime call instead of two.

This kind of comparison occurs in 38 places in the stdlib,
mostly in the net and os packages.

benchmark                     old ns/op     new ns/op     delta
BenchmarkCmpIfaceConcrete     31.6          7.92          -74.94%
BenchmarkCmpEfaceConcrete     29.7          7.91          -73.37%

Fixes #9370.

Change-Id: I7c4555950bcd6406ee5c613be1f2128da2c9a2b7