Current scheduler and I/O work

This is all of my scheduler work from the last 3 weeks or so. I've had to abort several previous pull requests to hunt down what turned out to be upstream libuv bugs, but I don't think there are any further blockers.

There is lots and lots of stuff here including:

* TCP
* The beginnings of runtime embedding APIs
* Porting various corners of core to be compatible with both schedulers
* libuv timer bindings
* Further refinement of I/O error handling, including a new, incomplete, `read_error` condition
* Incomplete refactoring to make tasks work without coroutines and user-space scheduling
* Implementations of Reader/Writer extension methods
* Implementations of the most important part of pipes

I'm particularly happy with how easy it was to implement the comm types on top of the scheduler. Note that these implementations do not use pipes and are more understandable and maintainable for it.

This branch passes 95% of the run-pass tests.

In the next week I'll probably spend some time adding preliminary multithreading and seeing how close we are to removing the old runtime.