SIGSEGV with ListBox under some circumstances
Here's a simple program:

```nim
import std/sets
import owlkettle

viewable App:
  rows: seq[string] = @["one", "two", "three"]

method view(app: AppState): Widget =
  gui:
    Window:
      ListBox:
        selectionMode = SelectionSingle

        proc select(pages: HashSet[int]) =
          discard

        for r in app.rows:
          Label:
            text = r
            xAlign = 0
            margin = 5

brew(gui(App()))
```

When closing the window it crashes with SIGSEGV
```
Traceback (most recent call last)
/home/dawid/scratch/nim_stuff/simple_gtk/list_box.nim(22) list_box
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle.nim(180) brew
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/mainloop.nim(55) runMainloop
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(2015) selectedRowsChanged
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(30) redraw
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(79) redraw
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(121) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(111) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(83) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(2023) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(160) updateChildren
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(1969) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(111) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(83) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(353) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(59) updateState
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
fish: Job 1, './list_box' terminated by signal SIGSEGV (Address boundary error)
```

Commenting out either `select` proc or `margin` from label widget fixes the issue.