cmd/protoc-gen-go: generate for v2-only dependencies

This removes yet another set of dependencies of v2 on v1.
The only remaining dependency are in the _test.go files,
primarily for proto.Equal.

Changes made:
* cmd/protoc-gen-go no longer generates any functionality that depends
on the v1 package, and instead only depends on v2.
* internal/fileinit.FileBuilder.MessageOutputTypes is switched from
protoreflect.MessageType to protoimpl.MessageType since the
implementation must be fully inialized before registration occurs.
* The test for internal/legacy/file_test.go is switched to a legacy_test
package to avoid a cyclic dependency.
This requires Load{Enum,Message,File}Desc to be exported.

Change-Id: I43e2fe64cff4eea204258ce11e791aca5eb6e569
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/169298
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/legacy/message.go b/internal/legacy/message.go
index cc20053..9f9742d 100644
--- a/internal/legacy/message.go
+++ b/internal/legacy/message.go
@@ -38,7 +38,7 @@
 	}
 
 	// Slow-path: derive message descriptor and initialize MessageType.
-	md := loadMessageDesc(t)
+	md := LoadMessageDesc(t)
 	mt := new(pimpl.MessageType)
 	mt.GoType = t
 	mt.PBType = ptype.GoMessage(md, func(pref.MessageType) pref.Message {
@@ -54,9 +54,11 @@
 var messageDescLock sync.Mutex
 var messageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
 
-// loadMessageDesc returns an MessageDescriptor derived from the Go type,
+// LoadMessageDesc returns an MessageDescriptor derived from the Go type,
 // which must be a *struct kind and not implement the v2 API already.
-func loadMessageDesc(t reflect.Type) pref.MessageDescriptor {
+//
+// This is exported for testing purposes.
+func LoadMessageDesc(t reflect.Type) pref.MessageDescriptor {
 	return messageDescSet{}.Load(t)
 }
 
@@ -124,7 +126,7 @@
 	}
 	if md, ok := mv.(messageV1); ok {
 		b, idxs := md.Descriptor()
-		fd := loadFileDesc(b)
+		fd := LoadFileDesc(b)
 
 		// Derive syntax.
 		switch fd.GetSyntax() {
@@ -235,7 +237,7 @@
 		if ev, ok := reflect.Zero(t).Interface().(pref.Enum); ok {
 			f.EnumType = ev.Type()
 		} else {
-			f.EnumType = loadEnumDesc(t)
+			f.EnumType = LoadEnumDesc(t)
 		}
 	}
 	if f.MessageType == nil && (f.Kind == pref.MessageKind || f.Kind == pref.GroupKind) {