Halt! - implementing stopping the connection
RaceToDeath - fixing a potential race condition

There was a potential race in a scenario where the user would call `stop` on an already disconnected connection and `start` on the same connection but on a different thread. In that case the call to `stop` would unconditionally null out the transport but since this was not happening in the lock the transport could have been set in the concurrent `start` request so nulling it out would cause a crash. To fix this we are taking a lock to block the start request and resetting the transport only if the previous state was `disconnecting` for cases where the starting connection already went past the lock (and therefore changed the state to 'connecting`)
CopyingIsForbidden - send should not copy data but pass by const reference, shared_ptr and instances of classes with shared_ptr members should not be passed by value if not needed to avoid the cost of incrementing/decrementing the ref count which are atomic operations and hence not very cheap.
ExceptionsToCopyright - allow copying connection instances

Allowing compiler generated copy ctor and assignment operator in the connection class to enable passing by value. The compiler generated copy ctor and assignment operator were added to avoid problems when we used a raw pointer for pImpl. Now we are using a `shared_ptr` so this is no longer an issue. In addition not being able to pass the `connection` by value encouraged to pass it by reference to task continuation which may result in crashes when a continuation is executed after the referenced variable went out of scope.