Prefix hooks
Threading snapshot #1: working initial display

- Config thread has been established.
- Item/tag/attribute thread has been established.
- Initial display occurs

Caveats:

- No input, instead GUI just constantly syncs/refreshes/redraws
- Tags are dropping items that could just be refreshed.
- A bunch of other XXX TODOs for stuff that's not important for input is
  rigged up.
Threading snapshot #2: working basic input

- Input and GUI threads established
- Commands will be dispatched

Caveats:

- No aliases (':browser' et. al.)
- Some commands break ('goto')
- Some commands are missing (basics from old gui.py)
- No command line
Threading snapshot #3: readline + quit

- Readline patch now integrated to get input
- Quit works again, added bonus of shutting up zsh alarm warnings

Caveats:

- Still no aliases, still missing and broken commands
Threading fixes #1

- Make reader work
- Route attributes through item thread
- Unfake curtags
- Fix item offset setting (not sure why this didn't crop up on old
  code).
canto-state, not canto_state

Wow, this caused some really annoying behavior.
Threading fixes #2

- Make add / del tag less broken (untested)
- Fix tagcore (logging, removal junk)
- Add annoying but useful tick debug log output
- Automatically fetch new items on TAGCHANGE
- Fix slow scroll (refresh being done unnecessarily)
- Fix story fresh_state break
Fix trying to redraw with old item info
Hook up WINCH, speed up artificial sync timer
strtags accessor, reader provoke refresh
Hook scrutiny + fixes

Finally went through and decided I should make sure the hooks being
called from another thread wouldn't cause issues. Most of them were ok
(merely looking at the hook info to determine whether it should trigger
a redraw/refresh) but I didn't find a theoretical problem with the
items_added and removed hooks in TagList and a few places where I was
bad calling refresh() instead of setting the global needs_refresh
variable to be lazy.
Tie sync into gui thread

I didn't want to have to do this because the sync is a little heavier
weight, but it's the easiest solution to the problem that some commands
(i.e. ones that use items or function on ranges of items) require the
GUI stuff (like TagList's linked list of objects) to be up to date after
a sync.

If the work ends up being too much, I'll do all the prep before and turn
sync() into a simple reference switch. For now, I don't notice a
difference.
Eviscerate the command infrastructure

- Eliminate command_format
- Eliminate all of the command validators

A brief layout of goals and structure

- Unify completion generation and validation
- Unify built-in and plugin command signature ( self, obj, args)

I understand that a lot of this stripped validation code will return in
some form, but none of the prompt stuff will be relevant with tab
completion.
Minor fixes

- Remove graphical logger so exit logging doesn't try to use curses
- Check gui still alive before tick/winch (same reason)
- Don't wait a second to do initial alarm() call.
- Remove dead code / comments
Working completion snapshot

Relative scrolling works as a proof of concept.

The root commands and args should be completed and validated, but
considering rel-set-cursor takes a single int argument and can't really
say it's working.

The next step is to convert the existing commands to register and use
registered argument types.

Doing something intelligent with out-of-line completion help text is
also a priority. I might change the help text to a generator as well.
Better subset of commands converted

Still a lot of brokenness, but at least you can goto and quit as well as
simple scroll.
item-list properly takes domains and ranges

So, for example, the $ bind works properly now (`item-state read tag,0-.`)

A list like 0,1,tag,0,1 will resolve to global items 0 and 1 as well as
selected tag items 0 and 1.

Mildly tested =P
Fix backspace

Had this before, but lost it. Convert curses KEY_BACKSPACE into '\b'
that readline will recognize.
Bulk command/type registry
Update reader commands