major refactoring of the entire project. moved constructors to factory
static methods so the entire engine uses std::unique_ptr for its objects
instead of std::shared_ptr