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.
This is the case where buf[0] is a valid element, and we are not inserting into buf[0].  

We move and wrap tail such that it is pointing to buf[cap-1].

Now we need to copy buf[0] to buf[cap-1]. Then move all the elements up to the index we want to insert at back one position, so now there is room for the new element.