add MoveItems to RingBuf, fixes  #19085

r? @huonw @csherratt
If it's not already the case, Rust could define offset to always be valid on any pointer to a zero-sized type (e.g. if it's problematic for LLVM, the front-end can just detect these small types and output noop instead of the real GEPi).

I've asked on #llvm for additional input, but I think this is probably OK. (One can regard any place in memory as a valid instance of a zero-sized type.)