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 think it would be useful to establish that there are three main cases:

* elements are contiguous
* elements are discontiguous - and index is in the tail half
* elements are discontiguous - and index is in the head half

With each case subdivided into:

* index is closer to head
* index is closer to tail