Robin->Hood - enforcing the websocket_transport to be used as a pointer

I prototyped the 'connect' request and it seems that making the `receive_loop` a member of the `websocket_transport` would make it easier to invoke a callback when a message is received. If the mechanism is implemented in the `transport` type we could call it from each transport instead of implementing it in each transport. Because the `receive_loop` schedules itself in a task we need to pass `this` a `shared_ptr` which results in deriving the class from `std::enable_shared_from_this` which results in converting all the usages to `shared_ptr`'s to prevent from incorrect usages resulting in undefined behavior.
@BrennanConroy - I fixed the leak in a separate checkin (ebabd81574ece888d9d9768bc7d695bdbb66cbeb) I made a part of this PR. I am going to squash both commits together when merging in this PR so I did not put too much effort in the description but I added a comment in the code about why we are using `weak_ptr`. I will review the usage of `shared_ptr`s between `connection_impl` and `transport` - we have/are going to have circular dependency there which will lead to similar kind of leaks.