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/fileinit/desc.go b/internal/fileinit/desc.go
index e375e3f..73004d3 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -13,6 +13,7 @@
 	"reflect"
 	"sync"
 
+	pimpl "github.com/golang/protobuf/v2/internal/impl"
 	pragma "github.com/golang/protobuf/v2/internal/pragma"
 	ptype "github.com/golang/protobuf/v2/internal/prototype"
 	pfmt "github.com/golang/protobuf/v2/internal/typefmt"
@@ -110,7 +111,7 @@
 	// MessageOutputTypes is where Init stores all initialized message types
 	// in "flattened ordering". This includes slots for map entry messages,
 	// which are skipped over.
-	MessageOutputTypes []pref.MessageType
+	MessageOutputTypes []pimpl.MessageType
 	// ExtensionOutputTypes is where Init stores all initialized extension types
 	// in "flattened ordering".
 	ExtensionOutputTypes []pref.ExtensionType
@@ -138,12 +139,19 @@
 	}
 
 	// Copy type descriptors to the output.
+	//
+	// While iterating over the messages, we also determine whether the message
+	// is a map entry type.
+	messageGoTypes := fb.GoTypes[len(fd.allEnums):][:len(fd.allMessages)]
 	for i := range fd.allEnums {
 		fb.EnumOutputTypes[i] = &fd.allEnums[i]
 	}
 	for i := range fd.allMessages {
-		if mt, _ := fd.allMessages[i].asDesc().(pref.MessageType); mt != nil {
-			fb.MessageOutputTypes[i] = mt
+		if messageGoTypes[i] == nil {
+			fd.allMessages[i].isMapEntry = true
+		} else {
+			fb.MessageOutputTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
+			fb.MessageOutputTypes[i].PBType = fd.allMessages[i].asDesc().(pref.MessageType)
 		}
 	}
 	for i := range fd.allExtensions {