internal/impl: add fast-path for IsInitialized

This currently returns uninformative errors from the fast path and then
consults the slow, reflection-based path only when an error is detected.
Perhaps it's worth going through the effort of producing better errors
directly on the fast path.

Change-Id: I68536e9438010dbd97dbaff4f47b78430221d94b
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171462
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/codec_field.go b/internal/impl/codec_field.go
index 38bd392..05bc202 100644
--- a/internal/impl/codec_field.go
+++ b/internal/impl/codec_field.go
@@ -15,12 +15,14 @@
 type pointerCoderFuncs struct {
 	size    func(p pointer, tagsize int, opts marshalOptions) int
 	marshal func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error)
+	isInit  func(p pointer) error
 }
 
 // ifaceCoderFuncs is a set of interface{} encoding functions.
 type ifaceCoderFuncs struct {
 	size    func(ival interface{}, tagsize int, opts marshalOptions) int
 	marshal func(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error)
+	isInit  func(ival interface{}) error
 }
 
 // fieldCoder returns pointer functions for a field, used for operating on