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 don't think this diagram is right. I think it should be:

```
        //    H         T             I
        //   [. . . . . o o o o o o o A o o o]
        //      H       T
        // 3 [o . . . . o o o o o o o I A o o]
        //    M                         M M M
```