Don't strip vector sizes down to (char) in saves (#9367)

Someone managed to get a stack of 179 chunks, but a stray (char) was
turning that into -77, which was stored as (uint64_t)-77 and then
unmarshalled into a vec_size (= uint16_t), appearing to have size 65459.

For new saves, marshall the size correctly.  To handle old saves, convert
the uint64_t to an unsigned char before converting it to a vec_size
(uint16_t): that loses sizes > 255, but those wouldn't have been stored
correctly anyway.