Improve caching; use async.detect for MUCH faster openAst

Refs #3

We lose the error, but I guess it's not that important, and
the speedup from shortcircuiting is tremendous