MemTagに型をいくつか持たせられるようにした

MemTagの型はMemTagTypeによって指定する:
MTT_NOT_FOUND は、初期化直後で、型が指定されていない状態。
MTT_COMPVAL は、基本型である複素数型を保持していることを示す。
MTT_FUNCPTR は、関数ポインターを保持していることを示す。
MTT_VARPTR は、変数ポインターを保持していることを示す。

現状では、関数ポインターをどのように実現するかは未定で、未実装。
ある時点のNodeへのポインターを関数ポインターと見なす予定で考えている。

変数ポインターも現状では未実装だが、
MemTagへのポインターを変数ポインターと見なす予定で考えている。

MemTagが型を保持するので、変数宣言において型を指定する必要が生じたので、
mem_create_var(), mem_read_var_memtag(), mem_read_var_value() の引数に、
MemTagType も必要となった。

mem_read_var_memtag() および mem_read_var_value() は、
それぞれ MemTag, Complex を返す関数だが、
従来は型が複素数型のみだったので、変数が未宣言であった場合は、自動的に宣言していた。
今回の変更で型の指定が必要となったので、これら関数に引数として型も指定するようになった。
この際の型の意味は、未定義だった場合に自動的に宣言する場合の型であり、
もしも既に変数が宣言済みであった場合には無視される。

たとえば、もしも変数 A が MTT_COMPVAL 型として宣言されていたとして、
その状態において a = mem_read_var_memtag("A", MTT_FUNCPTR, 0); としたならば、
a は MTT_COMPVAL 型として（MTT_FUNCPTR ではなく）のMemTagが返ってくる。

一方、もしも変数 A が未定義であったならば、
a = mem_read_var_memtag("A", MTT_FUNCPTR, 0); は、MTT_FUNCPTR 型のMemTagが返ってくる。