How to set up a modern C+ + smart pointer strategy without turning object ownership into unnecessary shared_ptr usage?