Less strict from_hash method

There is no reason why the type couldn't accept hash that contains
the data it needs. Therefore, I've made the TYPE_KEY optional and
not the only source of truth. When deserializing, we can take advantage
of knowing what type is expected. Sometimes it's not known, therefore
we need the hint of TYPE_KEY, but for most cases it works.

This allows to take any hash and load it as algbrick type directly,
useful for desribing any hashes, especially from REST or message queue.
I could imaging this being used in Dynflow as well.