proto, internal/errors: add Error sentinel, errors.Wrap

Add a sentinel proto.Error error which matches all errors returned by
packages in this module.

Document that protoregistry.NotFound is an exact sentinel value for
performance reasons.

Add a Wrap function to the internal/errors package and use it to wrap
errors from outside sources (resolvers). Wrapped errors match
proto.Error.

Fixes golang/protobuf#1021.

Change-Id: I45567df3fd6c8dc9a5caafdb55654827f6fb1941
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/215338
Reviewed-by: Joe Tsai <joetsai@google.com>
diff --git a/proto/decode.go b/proto/decode.go
index d8b9187..b712786 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -124,7 +124,7 @@
 		if fd == nil && md.ExtensionRanges().Has(num) {
 			extType, err := o.Resolver.FindExtensionByNumber(md.FullName(), num)
 			if err != nil && err != protoregistry.NotFound {
-				return err
+				return errors.New("%v: unable to resolve extension %v: %v", md.FullName(), num, err)
 			}
 			if extType != nil {
 				fd = extType.TypeDescriptor()
diff --git a/proto/messageset.go b/proto/messageset.go
index e27e0b7..f9af2ad 100644
--- a/proto/messageset.go
+++ b/proto/messageset.go
@@ -78,7 +78,7 @@
 		return errUnknown
 	}
 	if err != nil {
-		return err
+		return errors.New("%v: unable to resolve extension %v: %v", md.FullName(), num, err)
 	}
 	xd := xt.TypeDescriptor()
 	if err := o.unmarshalMessage(v, m.Mutable(xd).Message()); err != nil {
diff --git a/proto/proto.go b/proto/proto.go
index 983fc71..1fec109 100644
--- a/proto/proto.go
+++ b/proto/proto.go
@@ -5,8 +5,19 @@
 package proto
 
 import (
+	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
 // Message is the top-level interface that all messages must implement.
 type Message = protoreflect.ProtoMessage
+
+// Error matches all errors produced by packages in the protobuf module.
+//
+// That is, errors.Is(err, Error) reports whether an error is produced
+// by this module.
+var Error error
+
+func init() {
+	Error = errors.Error
+}