have execute() et al return a reader for output, more stateless for testing