Store only values and smart pointers in containers

Store objects of value in containers. Containers assume they contain value-like types, including value types (held directly), smart pointers, and iterators.