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/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index b82379e..a0ae3f0 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -63,7 +63,8 @@
 		return false
 	}
 	t := extensionTypeFromDesc(x.Desc)
-	if t.Cardinality() == pref.Repeated {
+	d := t.Descriptor()
+	if d.Cardinality() == pref.Repeated {
 		return t.ValueOf(x.Value).List().Len() > 0
 	}
 	return true
@@ -75,13 +76,14 @@
 		return pref.Value{}
 	}
 	t := extensionTypeFromDesc(x.Desc)
+	d := t.Descriptor()
 	if x.Value == nil {
 		// NOTE: x.Value is never nil for Lists since they are always populated
 		// during ExtensionFieldTypes.Register.
-		if t.Kind() == pref.MessageKind || t.Kind() == pref.GroupKind {
+		if d.Kind() == pref.MessageKind || d.Kind() == pref.GroupKind {
 			return pref.Value{}
 		}
-		return t.Default()
+		return d.Default()
 	}
 	return t.ValueOf(x.Value)
 }
@@ -102,7 +104,8 @@
 		return
 	}
 	t := extensionTypeFromDesc(x.Desc)
-	if t.Cardinality() == pref.Repeated {
+	d := t.Descriptor()
+	if d.Cardinality() == pref.Repeated {
 		t.ValueOf(x.Value).List().Truncate(0)
 		return
 	}
@@ -149,31 +152,33 @@
 }
 
 func (p legacyExtensionTypes) Register(t pref.ExtensionType) {
-	if p.mi.PBType.FullName() != t.Extendee().FullName() {
+	d := t.Descriptor()
+	if p.mi.PBType.Descriptor().FullName() != d.Extendee().FullName() {
 		panic("extended type mismatch")
 	}
-	if !p.mi.PBType.ExtensionRanges().Has(t.Number()) {
+	if !p.mi.PBType.Descriptor().ExtensionRanges().Has(d.Number()) {
 		panic("invalid extension field number")
 	}
-	x := p.x.Get(t.Number())
+	x := p.x.Get(d.Number())
 	if x.Desc != nil {
 		panic("extension descriptor already registered")
 	}
 	x.Desc = extensionDescFromType(t)
-	if t.Cardinality() == pref.Repeated {
+	if d.Cardinality() == pref.Repeated {
 		// If the field is repeated, initialize the entry with an empty list
 		// so that future Get operations can return a mutable and concrete list.
 		x.Value = t.InterfaceOf(t.New())
 	}
-	p.x.Set(t.Number(), x)
+	p.x.Set(d.Number(), x)
 }
 
 func (p legacyExtensionTypes) Remove(t pref.ExtensionType) {
-	if !p.mi.PBType.ExtensionRanges().Has(t.Number()) {
+	d := t.Descriptor()
+	if !p.mi.PBType.Descriptor().ExtensionRanges().Has(d.Number()) {
 		return
 	}
-	x := p.x.Get(t.Number())
-	if t.Cardinality() == pref.Repeated {
+	x := p.x.Get(d.Number())
+	if d.Cardinality() == pref.Repeated {
 		// Treat an empty repeated field as unpopulated.
 		v := reflect.ValueOf(x.Value)
 		if x.Value == nil || v.IsNil() || v.Elem().Len() == 0 {
@@ -183,7 +188,7 @@
 	if x.Value != nil {
 		panic("value for extension descriptor still populated")
 	}
-	p.x.Clear(t.Number())
+	p.x.Clear(d.Number())
 }
 
 func (p legacyExtensionTypes) ByNumber(n pref.FieldNumber) pref.ExtensionType {