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.
I'm not sure what the subtlety is. To the user, it appears as if the element was inserted at 'i' (the index they passed in), and the element that was at 'i' is now at 'i+1'