Reworked the way Type's are defined

TypeSingleton no longer contains a static member of its Type. With the
DefineType macro, a static instance of TypeSingle is created, and all
following code is executed in its constructor.