reflect/protoreflect: add Descriptor specific methods

Added methods:
	Enum.Descriptor
	Message.Descriptor
	EnumType.Descriptor
	MessageType.Descriptor
	ExtensionType.Descriptor
	Message.New

All functionality is switched over to use those methods instead of
implicitly relying on the fact that {Enum,Message}Type implicitly
implement the associated descriptor interface.

This CL does not yet remove {Enum,Message}.Type or prevent
{Enum,Message,Extension}Type from implementating a descriptor.
That is a subsequent CL.

The Message.New method is also added to replace functionality
that will be lost when the Type methods are removed.

Change-Id: I7fefde1673bbd40bfdac489aca05cec9a6c98eb1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/174918
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/fileinit/desc.go b/internal/fileinit/desc.go
index 1665b30..0e9ef53 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -302,6 +302,7 @@
 	}
 )
 
+func (ed *enumDesc) Descriptor() pref.EnumDescriptor { return ed }
 func (ed *enumDesc) GoType() reflect.Type            { return ed.lazyInit().typ }
 func (ed *enumDesc) New(n pref.EnumNumber) pref.Enum { return ed.lazyInit().new(n) }
 func (ed *enumDesc) Options() pref.ProtoMessage {
@@ -420,10 +421,11 @@
 	}
 	return messageDescriptor{mb}
 }
-func (mt messageType) GoType() reflect.Type             { return mt.lazyInit().typ }
-func (mt messageType) New() pref.Message                { return mt.lazyInit().new() }
-func (mt messageType) Options() pref.ProtoMessage       { return mt.options() }
-func (md messageDescriptor) Options() pref.ProtoMessage { return md.options() }
+func (mt messageType) Descriptor() pref.MessageDescriptor { return messageDescriptor{mt.messageDesc} }
+func (mt messageType) GoType() reflect.Type               { return mt.lazyInit().typ }
+func (mt messageType) New() pref.Message                  { return mt.lazyInit().new() }
+func (mt messageType) Options() pref.ProtoMessage         { return mt.options() }
+func (md messageDescriptor) Options() pref.ProtoMessage   { return md.options() }
 
 func (fd *fieldDesc) Options() pref.ProtoMessage {
 	return unmarshalOptions(descopts.Field, fd.options)
@@ -482,12 +484,13 @@
 		jsonName    string
 		isPacked    bool
 		defVal      defaultValue
-		enumType    pref.EnumType
-		messageType pref.MessageType
+		enumType    pref.EnumDescriptor
+		messageType pref.MessageDescriptor
 		options     []byte
 	}
 )
 
+func (xd *extensionDesc) Descriptor() pref.ExtensionDescriptor { return xd }
 func (xd *extensionDesc) GoType() reflect.Type                 { return xd.lazyInit().typ }
 func (xd *extensionDesc) New() pref.Value                      { return xd.lazyInit().new() }
 func (xd *extensionDesc) ValueOf(v interface{}) pref.Value     { return xd.lazyInit().valueOf(v) }