Add beast::asio::basic_streambuf (RIPD-661):

This is class whose interface is identical to the `boost::asio::basic_streambuf`, and uses an implementation that stores the data in multiple discontiguous linear buffers, expanding and shrinking as needed. The implementation is complex, with the core algorithm implemented in these functions `prepare`, `commit`, and `consume`. These functions need to be audited line by line for correctness. The Overlay peers are modified to use this new streambuf (its a drop in replacement for `boost::asio::basic_streambuf`). rippled runs connected to the network without assertions or crashes using this code.
Reviewers: @rec @JoelKatz @ximinez

Fwiw, we will probably never need this, but allocators are allowed to customize alloc_traits::construct, and so std::containers always use alloc_traits::construct to pick up that potential customization.  There is one std::class that takes advantage of this customization:  std::scoped_allocator_adaptor.  Most of the time alloc_traits::construct is identical to the placement new we already have.

Complicating things further, I have no idea if alloc_traits::construct is implemented everywhere.  I know it is on libc++, but that's all I know.