This is motivated by concern about UB from accessing the ObjHeader in
the Obj union. More concretely, modifications to an ObjHeader may modify
the implicit padding in the struct, breaking fields that were inside the
padding on the underlying object. Having mismatched integer types in the
header prefix should be fine since Rust's unions seem to consider this
sort of punning acceptable as long as there are valid values for the
fields.