Fix constraint violation detection on SQLite

The general "constraint failed" is not necessarily indicative of
a check constraint failure, and it looks like some versions of
SQLite use the text for non-check constraint violations, so use
the more general ConstraintViolation exception.
Add Dataset#paged_each, for processing entire datasets without keeping all rows in memory

This seems to be a somewhat common need, and previously the
database-independent way to handle this has been to use the
pagination extension's Dataset#each_page method.  Unfortunately,
that yields datasets instead of rows, so if you just want to
process all rows, you end up with more complex code.

This new Dataset#paged_each method internalizes that complexity,
so the user can use it as a drop-in replacement for each.