internal/impl: support non-struct-pointer legacy message types

Support, to some limited degree, types which implement protoV1.Message
but which are not struct pointers. Our ability to work with these types
is largely limited to calling Marshal or Unmarshal methods, when
present.

Change-Id: Ie1b851d9e753e2b2cb189b17ffeefebe2d8b3a8f
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/198237
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/testprotos/irregular/irregular.proto b/internal/testprotos/irregular/irregular.proto
index 9d8cf52..949316b 100644
--- a/internal/testprotos/irregular/irregular.proto
+++ b/internal/testprotos/irregular/irregular.proto
@@ -14,3 +14,6 @@
   optional string s = 1;
 }
 
+// AberrantMessage is a message with an implementation with a non-struct underlying type.
+message AberrantMessage {
+}