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.
Yep, you're correct.

In the case that head moves from being contiguous to non-contiguous, it will always only require one copy because where head is pointing does not contain an element.

In the case of tail moving from contiguous to non-contiguous, if the insert is not at len - 1 in the buffer then it should require two copies.

               H             I     T
    [. . . . . o o o o o o o A o o o]

     T         H                                  
    [o . . . . o o o o o o o I A o o]
     M                         M M M

I will add a test case for this, and add the corner case.