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/isinit.go b/proto/isinit.go
index 199f181..01f956d 100644
--- a/proto/isinit.go
+++ b/proto/isinit.go
@@ -53,20 +53,14 @@
 			return true
 		}
 		if field.IsMap() {
-			if md.Fields().ByNumber(2).Message() == nil {
+			if field.MapValue().Message() == nil {
 				return true
 			}
 		}
 		// Recurse into the field
 		stack := append(stack, field.Name())
 		switch {
-		case field.IsMap():
-			v.Map().Range(func(key pref.MapKey, v pref.Value) bool {
-				stack := append(stack, "[", key, "].")
-				err = isInitialized(v.Message(), stack)
-				return err == nil
-			})
-		case field.Cardinality() == pref.Repeated:
+		case field.IsList():
 			for i, list := 0, v.List(); i < list.Len(); i++ {
 				stack := append(stack, "[", i, "].")
 				err = isInitialized(list.Get(i).Message(), stack)
@@ -74,6 +68,12 @@
 					break
 				}
 			}
+		case field.IsMap():
+			v.Map().Range(func(key pref.MapKey, v pref.Value) bool {
+				stack := append(stack, "[", key, "].")
+				err = isInitialized(v.Message(), stack)
+				return err == nil
+			})
 		default:
 			stack := append(stack, ".")
 			err = isInitialized(v.Message(), stack)