Put all Surfaces in shared_ptrs
This MR attempts to force usage of shared_ptrs to manage the ownership of Surfaces. The Surface constructors are made protected so the compiler will disallow any non managed construction. Surface provides a factory which will produce std::shared_ptr<Surface>. It also has methods which return a shared_ptr for any given instance, with the correct shared reference.
Closes ACTS-532
Edited by Paul Gessinger-Befurt