TemplateFreeWorld - replacing compile time polymorphism with runtime pol...

...ymorphism
1) this is actually implemented in one of the next PRs. I don't think we need to create an interface for this. We would just have a base class used in the product code which can be derived from and used in the test where the behavior will be overridden
2) why? returning the `unique_ptr` is a very explicit way of transferring the ownership and saying that the method is giving up any rights to this pointer (hence the `std::unique_ptr` and not `std::shared_ptr`). Returning a raw introduces confusion about who is supposed to delete the object and when it can be deleted. Also the current way of doing things prevents from memory leaks if the caller forgot to delete the object (or wrap the raw pointer with a smart pointer). The general rule I try to follow is to not pass raw pointers around - `connection` class is an exception because there is some weirdness about smart pointers, incomplete types and destructors (as a result of which the object wrapped by smart pointer may not be deleted) which I don't completely understand. If I understand this I might decide to convert it to std::unique_ptr as well.