Reimplement timetable.coffee, add things to test.

I _believe_ that this is what timetable.coffee is doing. With 100% less
trycatching, more extensibility, better output, and IPv6 support.
Too bad it's not coffeescript.