Optimize conversion of result and parameter values.

- Pull JdbcType and ResultConverter out of the driver cake for better
  reusability. The profile-specific Reader, Writer and Updater for
  ResultConverter are encapsulated in the new ResultConverterDomain.

- Use Scala specialization for JdbcType and remove Option types from
  the JdbcType interface, exposing primitive values and nullability
  through separate methods to avoid boxing.

- Provide manually specialized ResultConverters. The implementations
  for JDBC are also specialized accordingly.

- Fuse GetOrElseResultConverter(OptionResultConverter) to a single,
  specialized DefaultingResultConverter.

- Optimize ProductResultConverter.

- Encapsulate bidirectional mappings in TypeMapping and MappedScalaType
  in a new Mapper class which also holds a function for constructing an
  optional fast path converter.

- Make fast path converters easy to use with JdbcProfile with the
  JdbcFastPath result converter.

Test in JdbcMapperTest.testFastPath. UnboxedBenchmark shows the
performance of the new converters. Before this patch, reading 10 million
rows from a dummy ResultSet with the non-fast-path mapped query q1 takes
around 2000 ms. With the optimizations, that time is down to 670 ms. The
fast path converter in q2 eliminates boxing and brings the time down to
180 ms. Reusing a single row object like in q3 takes 140 ms and avoids
allocations entirely.
Use positional access in JDBC ResultConverters.

Instead of PositionedResult and PositionedParameters, converters now use
ResultSet and PreparedStatement directly. This allows access to
arbitrary converters without having to use them all in the given order.

- Use positional access in JdbcType.

- Bring back a PositionedResultIterator that is separate from the actual
  PositionedResult. The combined version was broken by design.

- Encode the column width for both, all columns and only non-AutoInc
  columns, in ResultConverters.

- Fix CodeGenRoundTripTest to not rely on getting a specific first
  element from an unordered query. Curiously, an "order by" clause
  causes SQLite to produce the *opposite* ordering in this case, so we
  limit the result set to the single correct result instead.