Since `str` may be able to realize a row and render it as a string, attempts to print a row use this route to circumvent `print-sequential` failing due to lazy evaluation.
* `dissoc`, `cons`, `=` -- both realize a full row.
* `count`, `empty` -- do not realize rows, `empty` doesn't use the builder at all.
* `str` -- attempts to realize a row (else returns the same "helpful" string as before).
* Combine adjacent `with-open` calls.
* Show how `set-parameters` is used.
* Add a section on batched parameters, with their caveats, and how to
use them.
* Move documentation from `ns` into `defprotocol` and the method
declarations.
* Indicate which protocols may be extended via metadata
(`SettableParameter` and `Sourceable`).
Ensures basic associative/lookup access do not cause row building;
ensures assoc/seq produce real maps; ensure datafiable-row produces a
real map with metadata.
* Remove `execute!` and `execute-one!` from `result-set`.
* Add `-execute-all` and `-execute-one` to the `Executable` protocol
instead.
* Remove `:row-fn` support.
* Allow a `PreparedStatement` to be `Connectable` so it can be used with
`datafy`/`nav`.
* Rewrite `RowBuilder` protocol and add `ResultSetBuilder` protocol; add
`as-arrays` as a builder.
Low-level `execute!` requires row function to be passed. High-level API
allows row function, else `datafiable-row`. Syntactic sugar still uses
`:row-fn`.