Text View widget : thread process can not change text buffer
your example widget codes are a great way to learn and understand how Owlkettle works, we can alter these codes to create own scripts. But now i encounter a bug (?) when using the Text View widget with a thread process : the content value of `app.buffer.text` can be read, but not written by it.

here's my script, which is a combination of https://github.com/can-lehmann/owlkettle/blob/main/examples/misc/threading.nim and https://github.com/can-lehmann/owlkettle/blob/main/examples/widgets/text_view.nim - my comments in this code give more details.

[ i mentioned this error also at the end of https://github.com/can-lehmann/owlkettle/issues/142 ]

```nim
import std/os
import owlkettle

viewable App:
  buffer: TextBuffer
  monospace: bool = false
  cursorVisible: bool = true
  editable: bool = true
  acceptsTab: bool = true
  indent: int = 0
  sensitive: bool = true
  sizeRequest: tuple[x, y: int] = (-1, -1) 
  tooltip: string = "" 

when compileOption("threads"):
  var thread: Thread[AppState]

proc threadProc(app: AppState) {.thread.} =
  while true:  # when this works, i want to output stdout of an external process this way..
    app.buffer.text = app.buffer.text & "HELLO" & "\n"  # gives error, but try-except does NOT catch it
    app.redrawFromThread()
    sleep(1000)

method view(app: AppState): Widget =
  result = gui:
    Window:
      title = "*** TEST ***"
      defaultSize = (1100, 600)

      HeaderBar {.addTitlebar.}:
        Button {.addLeft.}:
          style = [ButtonFlat]
          text = "GO"

          proc clicked() =
            when compileOption("threads"):
              createThread(thread, threadProc, app)

      ScrolledWindow:
        TextView:
          margin = 12
          buffer = app.buffer
          monospace = app.monospace
          cursorVisible = app.cursorVisible
          editable = app.editable
          acceptsTab = app.acceptsTab
          indent = app.indent
          sensitive = app.sensitive
          tooltip = app.tooltip
          sizeRequest = app.sizeRequest
          proc changed() = discard
        

when compileOption("threads") and (defined(gcOrc) or defined(gcArc)):
  let buffer = newTextBuffer()
  buffer.text = "first text line\n"
  brew(gui(App(buffer = buffer)))
else:
  quit "Compile with --threads:on and --gc:orc to enable threads"
```

i have no clue why this doesn't work .. it gives a severe error which can't be catched :

_SIGSEGV: Illegal storage access. (Attempt to read from nil?)
Segmentation fault (core dumped)_

what's happening ?