remove more shared_ptr churn, use by value + std::move pattern