1)  NO GLOBALS (ESCDELAY etc will be in the struct with accessors)
2)  An init function that returns a struct with a bunch of function pointers in
    it.
3)  UIFC will need to have the ability for the ciolib struct to be passed to
    it.
4)  Will support multiple independent windows.
5)  There will be a compatability library for JUST conio stuff.
6)  Any advanced features not in the conio API will not be present.
7)  Unicode (UTF-8) support... likely X11 first, followed by Curses, SDL and
    Win32.
8)  ANSI mode may never get proper unicode support... or at least not until
    everything else works.
9)  Unicode support will support GR access of the C1 set.  Most importantly,
    this means CSI (\x9b).  This is actually somewhat silly since it will take
    two bytes regardless, but if UCS-2 or something gets added in the future,
    it may make a difference, and there's no reason to show control codes.
10) Greatly expanded attribute sets, and in UTF-8 mode there will be no
    hackiness.  The great bright/bold debate will rage on though... possibly a
    new set/reset mode will be added to control it.
11) Double-height/Double-width/Double-size modes.  As is tradition, all the
    cells covered by the glyph must be the same character and attributes.  This
    opens a whole can of worms regarding how further updates work etc.  I'll
    strive to keep it sane and compatible, which may be impossible.
12) A Unicode cell will potentially have multiple codepoints "in" it.
13) We need a way to specify the initial mode.

Some sort of state checkpoint thing... you "save" the checkpoint, and send that
ID back and you get the same state returned.

Stack and state save thing

For CONIOng:
Layers:
0  - Solid fixed background (doesn't scoll)
1  - Text area background (scrolls, text area)
2  - Text area background bitmap (scrolls, text area)
3  - Text area background pixel (scrolls, text area)
4  - Bitmap background (doesn't scroll)
5  - Pixel background (doesn't scroll)
6  - Text area foreground (scrolls, text area)
7  - Text area foreground bitmap (scrolls, text area)
8  - Text area foreground pixel (scrolls, text area)
9  - Bitmap foreground (doesn't scroll)
10 - Pixel foreground layer (doesn't scroll)

Layer Attributes:
Layer 0:  "colour"
Layer 1:  <none>
Layer 2:  <none>
Layer 3:  "hidden"
Layer 4:  <none>
Layer 5:  "hidden"
Layer 6:  <none>
Layer 7:  <none>
Layer 8:  "hidden"
Layer 9:  <none>
Layer 10: "hidden"

A text area can be defined as having a given width and height with the
top-left corner positioned at any pixel location.  Text areas use a fixed
width font, and have multiple planes... text background, background bitmap,
background pixels, text foreground, foreground bitmap, foreground pixels
It will have the following attributes:
Fonts
Codepage
Tab stops
Cursor position
Auto-wrap
Blink enabled
Cursor vidible
Palette definition
Foreground visible
Foreground bitmaps visible
Foreground pixels visible
Background visible
Background bitmaps visible
Background pixels visible
Z-index
"Current" cell attributes (see below)

Each character cell will have the following attributes:
Codepoints (array)
Foreground colour
Background colour
Font
Flags
- Fast Blink
- Slow Blink
- Bold
- Italic
- Negative
- Concealed
- Underline
- Overstrike
- Double underline
- Double overstrike
- Double-wide
- Double-high
- Superscript
- Subscript

Bitmap layers contain zero or more bitmaps (likely WebP, maybe others)
which have a stacking order in the layer. Attributes:
position
hidden
paused (not animated)
Z-index

Pixel layers are simply an array of pixels that may be directly
manipulated.  No attributes are planned.

For the bitmap and pixel layers associated with a text area, they will
scroll with the text in that area.