Actually on closer examination I'm going to leave the w/stdouts in the op definitions. It's reasonable to have ops take a stream argument, and if they do they have to handle it correctly.
If it's for debugging, wouldn't it be easier if you just left it going to standard out? That way you could run it on the repl and see the output, and still wrap it in 'tostring or w/outfile if you wanted it to go to a string or file instead.
Maybe the stream argument could be made optional, and default do stdout? The redundancy would still exist, but it would allow us to use it both ways.