better eventing - actually do asynchronous I/O

The whole point of libuv isn't to spawn a thread and do a large number
of synchronous ops in it. It's to make everything asynchronous with
callbacks with respect to the event loop. Painful, but the entire point.

There's a lot of code duplication here that can be resolved with some
pointer indirection, but this will do for now.
process - use the glib memory slice allocator

Trying to reduce heap fragmentation as this is intended to be a long
running process but is doing quite a lot of small heap allocations.