shell: Orphan child windows when a shell surface is destroyed

We now track the child surfaces of a shell surface and the child surfaces
have a pointer back to their parent.  We need to clean all this up and
NULL out the childrens parent pointers when a shell surface is destroyed.

Closes: https://bugs.freedesktop.org/show_bug.cgi?id=72931
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index c82c00f..a8c4b3e 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -2853,6 +2853,8 @@
 static void
 destroy_shell_surface(struct shell_surface *shsurf)
 {
+	struct shell_surface *child, *next;
+
 	wl_signal_emit(&shsurf->destroy_signal, shsurf);
 
 	if (!wl_list_empty(&shsurf->popup.grab_link)) {
@@ -2877,6 +2879,10 @@
 	weston_view_destroy(shsurf->view);
 
 	wl_list_remove(&shsurf->children_link);
+	wl_list_for_each_safe(child, next, &shsurf->children_list, children_link) {
+		wl_list_remove(&child->children_link);
+		child->parent = NULL;
+	}
 
 	wl_list_remove(&shsurf->link);
 	free(shsurf);