Async Types

This has been a side project for quite a while. It's 95% there. The 5% is that exec doesn't return a promise so you can't tell when the exec has started. I don't think this is a massive problem since exec completion was async anyway.

All the tests pass, but I do need to add some async tests. The last few commits changed the way testing works quite dramatically, so I'd like to start the ball rolling on getting this merged in, or I'll have lots of merge pain ahead.