reflect/protoreflect: add helper methods to FieldDescriptor

Added API:
	FieldDescriptor.IsExtension
	FieldDescriptor.IsList
	FieldDescriptor.MapKey
	FieldDescriptor.MapValue
	FieldDescriptor.ContainingOneof
	FieldDescriptor.ContainingMessage

Deprecated API (to be removed in subsequent CL):
	FieldDescriptor.Oneof
	FieldDescriptor.Extendee

These methods help cleanup several common usage patterns.

Change-Id: I9a3ffabc2edb2173c536509b22f330f98bba7cf3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/176977
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/proto/decode.go b/proto/decode.go
index 51b2068..37334be 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -105,12 +105,12 @@
 		switch {
 		case fieldDesc == nil:
 			err = errUnknown
-		case fieldDesc.Cardinality() != protoreflect.Repeated:
-			valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
-		case !fieldDesc.IsMap():
+		case fieldDesc.IsList():
 			valLen, err = o.unmarshalList(b[tagLen:], wtyp, num, knownFields.Get(num).List(), fieldDesc)
-		default:
+		case fieldDesc.IsMap():
 			valLen, err = o.unmarshalMap(b[tagLen:], wtyp, num, knownFields.Get(num).Map(), fieldDesc)
+		default:
+			valLen, err = o.unmarshalScalarField(b[tagLen:], wtyp, num, knownFields, fieldDesc)
 		}
 		if err == errUnknown {
 			valLen = wire.ConsumeFieldValue(num, wtyp, b[tagLen:])
@@ -140,7 +140,7 @@
 		// TODO: C++ merges into oneofs, while v1 does not.
 		// Evaluate which behavior to pick.
 		var m protoreflect.Message
-		if knownFields.Has(num) && field.Oneof() == nil {
+		if knownFields.Has(num) && field.ContainingOneof() == nil {
 			m = knownFields.Get(num).Message()
 		} else {
 			m = knownFields.NewMessage(num)
@@ -166,8 +166,8 @@
 		return 0, wire.ParseError(n)
 	}
 	var (
-		keyField = field.Message().Fields().ByNumber(1)
-		valField = field.Message().Fields().ByNumber(2)
+		keyField = field.MapKey()
+		valField = field.MapValue()
 		key      protoreflect.Value
 		val      protoreflect.Value
 		haveKey  bool