Split QueryRunner out of QueryExecutor to ensure we can have multiple in effect.
Add swapping.
Introduce ProtocolHelper for replay reads
Use swapping only for forward result sets & make swap limit equal to fetch size