reflect/prototype: initial commit

Add the prototype package which provides constructors for
protoreflect.{Enum,Message,Extension}Type.

Switch all usages of the internal/prototype equivalent to the new package.
Switch all custom implementions of {Enum,Message}Type to the new package.

Change-Id: Ia9dae6fed4f2b90e55c123627044a7faf098c4b1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/178438
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/legacy/message.go b/internal/legacy/message.go
index 9919cdb..b17d705 100644
--- a/internal/legacy/message.go
+++ b/internal/legacy/message.go
@@ -15,6 +15,7 @@
 	pimpl "google.golang.org/protobuf/internal/impl"
 	ptype "google.golang.org/protobuf/internal/prototype"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/prototype"
 )
 
 // wrapMessage wraps v as a protoreflect.ProtoMessage,
@@ -38,10 +39,12 @@
 	md := LoadMessageDesc(t)
 	mt := new(pimpl.MessageInfo)
 	mt.GoType = t
-	mt.PBType = ptype.GoMessage(md, func(pref.MessageType) pref.Message {
-		p := reflect.New(t.Elem()).Interface()
-		return mt.MessageOf(p)
-	})
+	mt.PBType = &prototype.Message{
+		MessageDescriptor: md,
+		NewMessage: func() pref.Message {
+			return mt.MessageOf(reflect.New(t.Elem()).Interface())
+		},
+	}
 	if mt, ok := messageTypeCache.LoadOrStore(t, mt); ok {
 		return mt.(*pimpl.MessageInfo)
 	}