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.
This is the first database that returns lowercase columns in results so
there are a lot of conditionals in the tests now. It also returns entire
rows on inserts instead of just the generated key.
* 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.
* Fix `with-transaction` spec and how it invokes `transact` when no
options map is provided.
* Adds type hint to `with-transaction`.
* Document manual rollback of transactions.
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`.