compositors listen on the socket id "hilbert.compositor".

there is a one-to-one correspondence between sockets to the compositor and
windows. when a socket is opened, a window is created, and when a socket is
closed, its window is destroyed. this socket can be gifted to another process,
and the other process then becomes the window's owner.

data types:

  color:
    opaque dword (result of encode color system call).
    from c++, use euler::syscall::encode_color in euler/syscall.hpp.

  color rectangle:
    multiple hilbert colors, top to bottom by row, left to right within row

messages from applications to compositor:

  show window:
    byte: 0x00

  hide window:
    byte: 0x01

  set window dimensions:
    byte: 0x02
    dword: width
    dword: height

  set window title:
    byte: 0x03
    dword: length in bytes
    bytes: title

  update window region:
    byte: 0x04
    dword: start x
    dword: start y
    dword: width
    dword: height
    color rectangle: new content
