internal/impl: store extension values as Values

Change the storage type of ExtensionField from interface{} to
protoreflect.Value.

Replace the codec functions operating on interface{}s with ones
operating on Values.

Values are potentially more efficient, since they can represent
non-pointer types without allocation. This also reduces the number of
types used to represent field values.

Additionally, this change lays groundwork for changing the
user-visible representation of repeated extension fields from
*[]T to []T. The storage type for extension fields must support mutation
(thus *[]T currently); changing the storage type to a Value permits this
without the need to introduce yet another view on field values.

Change-Id: Ida336be14112bb940f655236eb58df21bf312525
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/192218
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/isinit.go b/internal/impl/isinit.go
index ffc65e9..3fd3674 100644
--- a/internal/impl/isinit.go
+++ b/internal/impl/isinit.go
@@ -66,12 +66,12 @@
 		return nil
 	}
 	for _, x := range *ext {
-		ei := mi.extensionFieldInfo(x.GetType())
+		ei := mi.extensionFieldInfo(x.Type())
 		if ei.funcs.isInit == nil {
 			continue
 		}
-		v := x.GetValue()
-		if v == nil {
+		v := x.Value()
+		if !v.IsValid() {
 			continue
 		}
 		if err := ei.funcs.isInit(v); err != nil {