Introduces the IPreparedStatementSetParameter protocol

This protocol allows users to override how prepared statement parameters are set. The default implementation keeps the current behavior of using `sql-value` to convert the value and then calling the `PreparedStatement#setObject(int, Object)` method.

As an example, and the motivation for this change, here's a protocol implementation for `joda.time.ReadableInstant` values that uses the three argument `#setTimestamp()` method to keep timezone information:

    (extend-protocol sql/IPreparedStatementSetParameter
      org.joda.time.ReadableInstant
      (prepared-statement-set-parameter [instant stmt idx]
        (let [timestamp (java.sql.Timestamp. (.getMillis instant))
              timezone (.. instant getZone toTimeZone)
              calendar (java.util.Calendar/getInstance timezone)])
        (.setTimestamp stmt idx timestamp calendar)))