I don't like how this forces adapter implementors to know more about details that should be handled by the core library, specifically having to call `to_hash` all over the place. 

Totally agree that `serializer_from_block_or_class` should either return a serializer or be renamed, and that the JsonAPI adapter should not rely on hash value order (how did I miss that!).

One option could be to have `serializer_from_block_or_class` return serializers as in this PR, and assign serializer instances directly to the `data` object instead of hashes. Then we would duck-type serializers so they behave like hashes so no need to call `#to_hash` on them. Something like:

```ruby
# serializer.rb
def [](key)
  to_hash[key]
end

def []=(key, value)
  to_hash[key] = value
end

def each(&block)
  to_hash &block
end
```
.. etc

A second option is that we collect serializers in the `data` object as well, but then reimplement `Serializer#to_hash` to recursively visit the data object and call `#to_hash` on all the members, resulting in a new real hash as the return value. Ie:

```ruby
# serializer.rb
def to_hash
  @to_hash ||= (
    self.instance_eval &self.class.schema
    adapter.to_hash.reduce({}) do |(k,v), memo|
      memo[k] = v.respond_to?(:to_hash) ? v.to_hash : v
      memo
    end
  )
end
```