gc: new typechecking rules

* Code for assignment, conversions now mirrors spec.
* Changed some snprint -> smprint.
* Renamed runtime functions to separate
  interface conversions from type assertions:
  convT2I, assertI2T, etc.
* Correct checking of \U sequences.

Fixes #840.
Fixes #830.
Fixes #778.

R=ken2
CC=golang-dev
https://golang.org/cl/1303042
diff --git a/test/interface/explicit.go b/test/interface/explicit.go
index bd1bd19..797cec8 100644
--- a/test/interface/explicit.go
+++ b/test/interface/explicit.go
@@ -8,34 +8,45 @@
 
 package main
 
-type T struct { a int }
+type T struct {
+	a int
+}
+
 var t *T
 
-type I interface { M() }
+type I interface {
+	M()
+}
+
 var i I
 
-type I2 interface { M(); N(); }
+type I2 interface {
+	M()
+	N()
+}
+
 var i2 I2
 
-type E interface { }
+type E interface{}
+
 var e E
 
 func main() {
-	e = t;	// ok
-	t = e;	// ERROR "need explicit|need type assertion"
+	e = t // ok
+	t = e // ERROR "need explicit|need type assertion"
 
 	// neither of these can work,
 	// because i has an extra method
 	// that t does not, so i cannot contain a t.
-	i = t;	// ERROR "missing|incompatible|is not"
-	t = i;	// ERROR "missing|incompatible|is not"
+	i = t // ERROR "incompatible|missing M method"
+	t = i // ERROR "incompatible|need type assertion"
 
-	i = i2;	// ok
-	i2 = i;	// ERROR "need explicit|need type assertion"
-	
-	i = I(i2);	// ok
-	i2 = I2(i);	// ERROR "need explicit|need type assertion"
+	i = i2 // ok
+	i2 = i // ERROR "missing N method"
 
-	e = E(t);	// ok
-	t = T(e);	// ERROR "need explicit|need type assertion|incompatible"
+	i = I(i2)  // ok
+	i2 = I2(i) // ERROR "missing N method"
+
+	e = E(t) // ok
+	t = T(e) // ERROR "need explicit|need type assertion|incompatible"
 }