Re-introduce the protobuf serializer

The serializer was removed under the assumption that it was largely handling coercion, which was unnecessary because Protobuf handled that already. This turned out to only be partially true. It was also ensuring that repeated values were wrapped in an array.

Re-introduce the Protobuf serializer, but this time simply handle wrapping any repeated fields in arrays (if they aren't already).

// @localshred @abrandoned