Add a setting to launch a separate CPU thread.
Add mutex locks around list management.

This way we can safely execute lists on a separate thread.
Add a simple message event system to the GE.

With this, the CPU thread feature now mostly works.
Add a way to synchronize with the GPU thread.
Bail when CPU thread disabled to ensure good perf.
Rename UseCPUThread to SeparateCPUThread.
Add a "multithreaded" UI option on Windows.

Not on other platforms since not yet tested.
Use separate condition vars/locks for GPU sync.
Use the native cond vars for the CPU thread.
Be more careful with the stall address.

In case it's moved while running the list.
Don't queue Flush() etc. while on GPU thread.

Oops, that makes it not actually flush properly of course.

Also made a simpler guard wrapper to avoid extra braces in too many
places.  Reduced contention areas slightly.
Try to prevent a deadlock if CPU doesn't NEXTFRAME.
Simplify easy_guard to avoid coding errors.
Don't allow gpu->Flush() to be called publicly.
Fix SyncThread() not syncing during last event.
Add multithread checkboxes to gl UI as well