Add beast::asio::basic_streambuf:

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

Prefer a single return so that the return value optimization can kick in.  Also, you don't need those spaghetti ifs:

    auto isFirst = (&e == *buffers_.begin_);
    auto isLast = (&e == *std::prev (buffers_.end_));
    auto size = isLast ? buffers_.out_pos_ : e.size();
    auto offset = isFirst : buffers_.in.pos_ : 0;

    return value_type(e.data(), size) + offset;