Normalize toplevel lifecycle management
Currently, GTK owns a reference to toplevels, and drops it when you call gtk_window_destroy().
In the future, we should handle toplevel like any other object. The constructor returns a reference, and if the last reference is dropped, the object is finalized.
We can still keep a list of toplevels for internal purposes.