internal/impl: treat a nil oneof wrapper as if it were unset

The old implementation had the behavior where a nil wrapper value:
	m := new(foopb.Message)
	m.OneofField = (*foopb.Message_OneofUint32)(nil)
was functionally equivalent to it being directly set to nil:
	m := new(foopb.Message)
	m.OneofField = nil
preserve this semantic in both the table-drive implementation
and the reflection implementation.

Change-Id: Ie44d51e044d4822e61d0e646fbc44aa8d9b90c1f
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/189559
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/impl/codec_field.go b/internal/impl/codec_field.go
index 16873e4..af6ce05 100644
--- a/internal/impl/codec_field.go
+++ b/internal/impl/codec_field.go
@@ -30,7 +30,7 @@
 			return pointer{}, false
 		}
 		v = v.Elem() // interface -> *struct
-		if v.Elem().Type() != ot {
+		if v.IsNil() || v.Elem().Type() != ot {
 			return pointer{}, false
 		}
 		return pointerOfValue(v).Apply(zeroOffset), true