Put/Get: smart pointer support

Created by: ax3l

Downstream in openPMD-api, @C0nsultant introduced a nice mechanism for user data-sharing which might be working well upstream in ADIOS2, too.

In Put/Get, you already support storing contiguous memory layouts such as raw pointers and std::vector (and as we learned std::span in the future, yay!). Can you please also add support for (std::unique_ptr<T> and) std::shared_ptr<T>?

shared_ptr is really great for memory passing, as you can increase the reference counter when users give memory to you and you can decrement it when you are done with it, e.g. on EndStep. This allows checking by ref-count or even passing the overall ownership of temporaries to ADIOS2, which is simplifies a lot on our side, as lifetime control is a typical issue in C++ code when handling raw memory in a highly asynchronous manner.

cc @franzpoeschel