Add ResultProcessor, a Repository collaborator

This reduces the reasons we might need to change a repository, since it
now knows less about what is being done with the results it receives
from a query.

The intention has always been to make the Repository the place the
queries live, but hopefully minimize the need for any business logic
seeping in there.

With this change, the repository knows about:

1. Atomicity of its operations
2. How many results to expect from the query.
3. The connection on which the statement should be executed
4. The statement to execute

Anything regarding what to do with that result once it's received from
the connection is delegated to the processor, which can do operations
before or after the block itself.

For instance, this is a clear path with which we can implement ruby-side
validation for objects that need it:

    def insert_one(record)
      return false if !record.valid?
      yield ->(result, conn) {
        require_one_result!(result)
        record.set_attributes(result.first) and record.inserted!
      }
      # Maybe do some stuff afterward, like set an "association" on an
      # object
      true
    rescue ConstraintError => e
      false
    end