Implement insert for RingBuf

This is a first pass at insert on RingBuf. I tried to keep it as simple as possible. I'm not sure of the performance implications of doing one copy vs. copying multiple times but moving a smaller amount of memory. I chose to stick with one copy, even if the amount of memory I have to move is larger.

I believe this is part of #18424 

@Gankro mentioned this was missing.
Yeah I don't think this will be acceptable. It would be very surprising if inserting at index 1 was this expensive in this data structure. Especially in such a "random" way from the user's perspective. It's especially bad because this cost isn't at all amortized, and pretty easy to trigger. That is, `RingBuf::new(); push_back(1); insert(1,1); insert(1,1); ... insert(1,1);` will take `O(n^2)` time.