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/proto/decode.go b/proto/decode.go
index fa6d443..51b2068 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -70,8 +70,8 @@
 }
 
 func (o UnmarshalOptions) unmarshalMessage(b []byte, m protoreflect.Message) error {
-	messageType := m.Type()
-	fieldTypes := messageType.Fields()
+	messageDesc := m.Descriptor()
+	fieldDescs := messageDesc.Fields()
 	knownFields := m.KnownFields()
 	unknownFields := m.UnknownFields()
 	var nerr errors.NonFatal
@@ -83,31 +83,34 @@
 		}
 
 		// Parse the field value.
-		fieldType := fieldTypes.ByNumber(num)
-		if fieldType == nil {
-			fieldType = knownFields.ExtensionTypes().ByNumber(num)
-			if fieldType == nil && messageType.ExtensionRanges().Has(num) {
-				extType, err := o.Resolver.FindExtensionByNumber(messageType.FullName(), num)
+		fieldDesc := fieldDescs.ByNumber(num)
+		if fieldDesc == nil {
+			extType := knownFields.ExtensionTypes().ByNumber(num)
+			if extType == nil && messageDesc.ExtensionRanges().Has(num) {
+				var err error
+				extType, err = o.Resolver.FindExtensionByNumber(messageDesc.FullName(), num)
 				if err != nil && err != protoregistry.NotFound {
 					return err
 				}
 				if extType != nil {
 					knownFields.ExtensionTypes().Register(extType)
-					fieldType = extType
 				}
 			}
+			if extType != nil {
+				fieldDesc = extType.Descriptor()
+			}
 		}
 		var err error
 		var valLen int
 		switch {
-		case fieldType == nil:
+		case fieldDesc == nil:
 			err = errUnknown
-		case fieldType.Cardinality() != protoreflect.Repeated:
-			valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldType)
-		case !fieldType.IsMap():
-			valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldType)
+		case fieldDesc.Cardinality() != protoreflect.Repeated:
+			valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
+		case !fieldDesc.IsMap():
+			valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldDesc)
 		default:
-			valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldType)
+			valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldDesc)
 		}
 		if err == errUnknown {
 			valLen = wire.ConsumeFieldValue(num, wtyp, b[tagLen:])