proto, internal/impl: make IsInitialized more consistent

Make the fast-path and slow-path versions of IsInitialized report
exactly the same errors: An errors.RequiredNotSet containing the
full name of one of the unset required fields.

Bugfix: Fast-path IsInitialized on a nil message reports an error only
when the message directly contains required fields.

Bugfix: Include fast-path IsInitialized in legacy messageIfaceWrapper.

Fixes golang/protobuf#887

Change-Id: Ia5e4b386f8c23f6f855d995f4a098b1338acbae3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185397
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/proto/isinit_test.go b/proto/isinit_test.go
index 232202f..1edbfb4 100644
--- a/proto/isinit_test.go
+++ b/proto/isinit_test.go
@@ -21,13 +21,13 @@
 	}{
 		{
 			&testpb.TestRequired{},
-			`proto: required field required_field not set`,
+			`proto: required field goproto.proto.test.TestRequired.required_field not set`,
 		},
 		{
 			&testpb.TestRequiredForeign{
 				OptionalMessage: &testpb.TestRequired{},
 			},
-			`proto: required field optional_message.required_field not set`,
+			`proto: required field goproto.proto.test.TestRequired.required_field not set`,
 		},
 		{
 			&testpb.TestRequiredForeign{
@@ -36,7 +36,7 @@
 					{},
 				},
 			},
-			`proto: required field repeated_message[1].required_field not set`,
+			`proto: required field goproto.proto.test.TestRequired.required_field not set`,
 		},
 		{
 			&testpb.TestRequiredForeign{
@@ -44,7 +44,7 @@
 					1: {},
 				},
 			},
-			`proto: required field map_message[1].required_field not set`,
+			`proto: required field goproto.proto.test.TestRequired.required_field not set`,
 		},
 	} {
 		err := proto.IsInitialized(test.m)