Implement the `serialize' step and generic hooks

The final step of a call to Yaks is transforming a syntax tree
representation (for JSON simply arrays and hashes) to a string. Before
Yaks did not care about this step, leaving it to the caller to call
JSON.dump or similar. To support non-JSON output formats with a uniform
interface this had to be pulled into Yaks. It is possible to skip the
serialize step to get the old behavior:

    Yaks.new do
      skip :serialize
    end

This is part of a generic hooks implementation, all steps, :map,
:format, :serialize, can now be hooked into with before,after,around, or
skip. Hooks are inserted into the processing pipeline, so the return
value of the hook is passed on to the next processing step.

    Yaks.new do
      around :serialize do |data|
        start = Time.now
        result = yield(data)
        puts "Serializing took #{Time.now-start}"
        result
      end

      before :map do |model|
        puts "Mapping an instance of #{model.class}"
        yield(model)
      end
    end