This is needed after https://github.com/bitcoin/bitcoin/pull/18338 which changed handleNotifications() Notifications& callback argument to std::shared_ptr<Notifications>.
Easiest way to support this was to change ProxyServerBase reference from a raw pointer to shared pointer and make necessary BuildField changes to pass along the shared_ptr. Alternative might have been to add more generic cleanup support to ProxyServerBase instead of hardcoding shared_ptr.
The change also required making the ReadField callback overload more generic, which was a straightforward but kind of big change that touched a lot of code.
There weren't any unit tests for callback support previously, so a lot of new test coverage was added. It includes coverage for shared_ptr lifetime correctness, making sure there's an IPC call decrementing server shared_ptr reference count when client shared_ptr proxy is reset.