Quick spike on constraint ruleset

This is how we'll allow users to build a constraint map in a Record.
This way they can implement the constraint_error! callback to handle a
constraint error in the way that makes sense for them. In an activemodel
situation, this might look like:

    class User < Norm::Record
      attribute :id,              Attr::Integer
      attribute :username,        Attr::String
      attribute :email,           Attr::String
      attribute :name,            Attr::String
      attribute :password_digest, Attr::String
      attribute :created_at,      Attr::Timestamp
      attribute :updated_at,      Attr::Timestamp

      constraints do |match|
        match.map type: :not_null, column_name: 'username',
          to: {username: "can't be blank"}
        match.map type: :check, column_name: 'username',
          to: {username: "must be longer"}
        match.map type: :not_null, column_name: 'name',
          to: {name: "can't be blank"}
        match.map type: :not_null, column_name: 'email',
          to: {email: "can't be blank"}
        match.map type: :check, column_name: 'email',
          to: {email: "must be longer"}
        match.map type: :not_null, column_name: 'password_digest',
          to: {password: "can't be blank"}
      end
    end

    class AuthenticatingUser
      include Norm::RecordDelegator(User)

      def constraint_error!(error)
        if rule = constraint_rule_for(error)
          rule.each do |attr, message|
            errors.add(attr, message)
          end
        end
      end
    end