the implementation of merkle patricia trie
the differences with the implementation of go-ethereum:
- use protobuf rather than RLP.
- immutable, every update(insert or delete) will get a new trie. This make it easier to implement transaction parallel execution like khipu.