reflect/protoreflect, reflect/protoregistry: move descriptor lookup to registry

Drop the protoreflect.FileDescriptor.DescriptorByName method.
Descriptor lookup will always happen through a protoregistry.Files, which
is more generally useful (it's rare that you want to find a descriptor in a
specific file, as opposed to a package which may be composed of multiple files).

Split protoregistry.Files descriptor lookup into individual per-type functions
(enum, message, extension, service), matching the preg.Types API.

Drop the ability to look up enum values, message fields, and service methods
for now. This can be easily added later if needed, and is trivial to implement
in user code. (e.g., look up the service and then consult sd.Methods.ByName().)

Change-Id: I2b3d8ef888921a8464ba1434eddab20c7d3a458e
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/172118
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/reflect/protodesc/protodesc.go b/reflect/protodesc/protodesc.go
index 41b4055..406e37f 100644
--- a/reflect/protodesc/protodesc.go
+++ b/reflect/protodesc/protodesc.go
@@ -311,18 +311,11 @@
 		return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
 	}
 	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
-	switch m, err := r.FindDescriptorByName(name); {
-	case err == nil:
-		m, ok := m.(protoreflect.MessageDescriptor)
-		if !ok {
-			return nil, errors.New("resolved wrong type: got %v, want message", typeName(m))
-		}
-		return m, nil
-	case err == protoregistry.NotFound:
+	md, err := r.FindMessageByName(name)
+	if err != nil {
 		return prototype.PlaceholderMessage(name), nil
-	default:
-		return nil, err
 	}
+	return md, nil
 }
 
 func findEnumDescriptor(s string, r *protoregistry.Files) (protoreflect.EnumDescriptor, error) {
@@ -330,18 +323,11 @@
 		return nil, errors.New("identifier name must be fully qualified with a leading dot: %v", s)
 	}
 	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
-	switch e, err := r.FindDescriptorByName(name); {
-	case err == nil:
-		e, ok := e.(protoreflect.EnumDescriptor)
-		if !ok {
-			return nil, errors.New("resolved wrong type: got %T, want enum", typeName(e))
-		}
-		return e, nil
-	case err == protoregistry.NotFound:
+	ed, err := r.FindEnumByName(name)
+	if err != nil {
 		return prototype.PlaceholderEnum(name), nil
-	default:
-		return nil, err
 	}
+	return ed, nil
 }
 
 func typeName(t protoreflect.Descriptor) string {