all: refactor extensions, add proto.GetExtension etc.

Change protoiface.ExtensionDescV1 to implement protoreflect.ExtensionType.

ExtensionDescV1's Name field conflicts with the Descriptor Name method,
so change the protoreflect.{Message,Enum,Extension}Type types to no
longer implement the corresponding Descriptor interface. This also leads
to a clearer distinction between the two types.

Introduce a protoreflect.ExtensionTypeDescriptor type which bridges
between ExtensionType and ExtensionDescriptor.

Add extension accessor functions to the proto package:
proto.{Has,Clear,Get,Set}Extension. These functions take a
protoreflect.ExtensionType parameter, which allows writing the
same function call using either the old or new API:

  proto.GetExtension(message, somepb.E_ExtensionFoo)

Fixes golang/protobuf#908

Change-Id: Ibc65d12a46666297849114fd3aefbc4a597d9f08
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/189199
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/proto/messageset.go b/proto/messageset.go
index 1c6ac29..e5d4bd5 100644
--- a/proto/messageset.go
+++ b/proto/messageset.go
@@ -71,14 +71,15 @@
 			if !md.ExtensionRanges().Has(num) {
 				return errUnknown
 			}
-			fd, err := o.Resolver.FindExtensionByNumber(md.FullName(), num)
+			xt, err := o.Resolver.FindExtensionByNumber(md.FullName(), num)
 			if err == protoregistry.NotFound {
 				return errUnknown
 			}
 			if err != nil {
 				return err
 			}
-			if err := o.unmarshalMessage(v, m.Mutable(fd).Message()); err != nil {
+			xd := xt.Descriptor()
+			if err := o.unmarshalMessage(v, m.Mutable(xd).Message()); err != nil {
 				// Contents cannot be unmarshaled.
 				return err
 			}