New feature: `Allocator` is upgraded to a tree-like structure and holds all customizations
Per discussions in #13, in order to make all customizations separated in different allocators, Allocator holds all customizations inside it now. That is, we can create a new Allocator instance a and call a.MarkAsScalar(t) to mark t as scalar only in the a without changing global default. What's more, Allocators are organized with a tree-like structure. One Allocator can inherit its parent's customizations automatically.
Per discussions in #11, Allocator.Clone and Allocator.CloneSlowly can be called in the func of SetCustomFunc without worrying about dead loop. That means, if we can call allocator.Clone(old) clone the old value in custom function then update some fields in the cloned value and finally set the cloned value to the new to return the value. It's useful when we need to hack very few fields in a complex type with lots of fields when cloning.
Full Changelog: v1.5.0...v1.6.0