net: make IP implement encoding.MarshalerText, encoding.UnmarshalerText

See golang.org/s/go12encoding for design.

R=golang-dev, bradfitz, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/12705043
diff --git a/src/pkg/net/ip_test.go b/src/pkg/net/ip_test.go
index 16f30d4..606344d 100644
--- a/src/pkg/net/ip_test.go
+++ b/src/pkg/net/ip_test.go
@@ -32,6 +32,11 @@
 		if out := ParseIP(tt.in); !reflect.DeepEqual(out, tt.out) {
 			t.Errorf("ParseIP(%q) = %v, want %v", tt.in, out, tt.out)
 		}
+		var out IP
+
+		if err := out.UnmarshalText([]byte(tt.in)); !reflect.DeepEqual(out, tt.out) || (tt.out == nil) != (err != nil) {
+			t.Errorf("IP.UnmarshalText(%q) = %v, %v, want %v", tt.in, out, err, tt.out)
+		}
 	}
 }
 
@@ -47,6 +52,7 @@
 	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0}, "2001:db8:0:0:1::"},
 	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0x1}, "2001:db8::1:0:0:1"},
 	{IP{0x20, 0x1, 0xD, 0xB8, 0, 0, 0, 0, 0, 0xA, 0, 0xB, 0, 0xC, 0, 0xD}, "2001:db8::a:b:c:d"},
+	{IPv4(192, 168, 0, 1), "192.168.0.1"},
 	{nil, "<nil>"},
 }
 
@@ -55,6 +61,15 @@
 		if out := tt.in.String(); out != tt.out {
 			t.Errorf("IP.String(%v) = %q, want %q", tt.in, out, tt.out)
 		}
+		if tt.in != nil {
+			if out, err := tt.in.MarshalText(); string(out) != tt.out || err != nil {
+				t.Errorf("IP.MarshalText(%v) = %q, %v, want %q, nil", out, err, tt.out)
+			}
+		} else {
+			if _, err := tt.in.MarshalText(); err == nil {
+				t.Errorf("IP.MarshalText(nil) succeeded, want failure")
+			}
+		}
 	}
 }