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/isinit.go b/proto/isinit.go
index 08edbd8..199f181 100644
--- a/proto/isinit.go
+++ b/proto/isinit.go
@@ -27,7 +27,7 @@
 
 // IsInitialized returns an error if any required fields in m are not set.
 func isInitialized(m pref.Message, stack []interface{}) error {
-	md := m.Type()
+	md := m.Descriptor()
 	known := m.KnownFields()
 	fields := md.Fields()
 	for i, nums := 0, md.RequiredNumbers(); i < nums.Len(); i++ {
@@ -41,7 +41,7 @@
 	known.Range(func(num pref.FieldNumber, v pref.Value) bool {
 		field := fields.ByNumber(num)
 		if field == nil {
-			field = known.ExtensionTypes().ByNumber(num)
+			field = known.ExtensionTypes().ByNumber(num).Descriptor()
 		}
 		if field == nil {
 			panic(fmt.Errorf("no descriptor for field %d in %q", num, md.FullName()))