MINOR: connection: remove an unwelcome dependency on struct stream

There was a reference to struct stream in conn_free() for the case
where we're freeing a connection that doesn't have a mux attached.
For now we know it's always a stream, and we only need to do it to
put a NULL in s->si[1].end.

Let's do it better by storing the pointer to si[1].end in the context
and specifying that this pointer is always nulled if the mux is null.
This way it allows a connection to detach itself from wherever it's
being used. Maybe we could even get rid of the condition on the mux.
diff --git a/src/backend.c b/src/backend.c
index 237668c..2407f8a 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1052,12 +1052,13 @@
 #if defined(USE_OPENSSL) && defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
 /*
  * Pick the right mux once the connection is established, we should now have
- * an alpn if available, so we are now able to choose.
+ * an alpn if available, so we are now able to choose. In this specific case
+ * the connection's context is &si[i].end.
  */
 static int conn_complete_server(struct connection *conn)
 {
 	struct conn_stream *cs = NULL;
-	struct stream *s = conn->ctx;
+	struct stream *s = container_of(conn->ctx, struct stream, si[1].end);
 	struct server *srv;
 
 	task_wakeup(s->task, TASK_WOKEN_IO);
@@ -1066,8 +1067,6 @@
 	if (unlikely(!(conn->flags & (CO_FL_WAIT_L4_CONN | CO_FL_WAIT_L6_CONN | CO_FL_CONNECTED))))
 		conn->flags |= CO_FL_CONNECTED;
 
-	if (!s)
-		goto fail;
 	if (conn->flags & CO_FL_ERROR)
 		goto fail;
 	si_detach_endpoint(&s->si[1]);
@@ -1338,7 +1337,7 @@
 		}
 #if defined(USE_OPENSSL) && defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
 		else {
-			srv_conn->ctx = s;
+			srv_conn->ctx = &s->si[1].end;
 			/* Store the connection into the stream interface,
 			 * while we still don't have a mux, so that if the
 			 * stream is destroyed before the connection is