1. Let 'isa<T>()' calls 'IsSameTypeId()' when T is final,
and we add 'final' mark to some final classes derived from Base;
2. Generate type id at compile time using constexpr hash function,
remove TypeIdManager and related code;
3. Add a tool script 'scripts/check_tid.sh' to check tid uniqueness;
4. Improve type search in 'proto_exporter.cc' and 'convert_utils_py.cc';
5. Add some missed MS_DECLARE_PARENT;
6. Ensure calls of 'parent_t::IsFromTypeId()' are all inlined.
The basic idea is: exploits data dependency to control the execution order
of side-effect operations, and keep the semantics of ANF unchanged.
The ControlDepend primitive is removed and there are two primitives added:
1. UpdateState:
```
a = Assign(para, value)
```
became:
```
a = Assign(para, value, u)
u = UpdateState(u, a)
```
2. Load:
```
x = Add(para, value)
```
became:
```
p = Load(para, u)
x = Add(p, value)
u = UpdateState(u, p)
```