The cost is that a upb_msg will now always have an overhead
of 2*sizeof(void*). This is comparable to proto2 overhead.
The benefit is that upb_msg is now self-describing, and
read-only algorithms can now operate on a upb_msg regardless
of the memory-management scheme.
Also, upb_array and upb_string now know inherently if they
own their associated memory, and upb_array has a generic
pointer for memory management purposes like upb_msg does.
This is the next step in bootstrapping. upb_struct defines the
in-memory layout that will be used by both compile-time and run-time
defintions of protobufs. descriptor.h describes the proto format
using this format.
The next step is to create a descriptor.c that can parse descriptor
protos into this format. Then real run-time reflection can begin.