Add runtime type information

The recursive definition of the static variable TypeInfo<T>::s_type is
not well-founded. A well-founded recursive definition could be achieved
through template specialization, i.e. TypeInfo<T*>. While this would
allow us to define Type::m_pointer_type to be null if T is not a pointer
type, it introduces more boilerplate code and still requires the runtime
assertion check for the precondition: Type::pointer_type() is called only
if Type::is_pointer() is true. Thus, unless the current definition causes
problems for other compilers, we leave it like this for now.