Fix element base because preSerialization was computing things. If preSerialization computes something that gets an SDE due to missing property let's say, then that SDE would be suppressed by the serializer code. You get a backtrace, not an SDE.
We call preSerialization explicitly now as part of the required evaluations of each factory object. The isError method cannot return false unless pre-serialization is definitely going to succeed.
There is an option in the TDML test rig to "compile all top level". If this is true, then each top level element will be compiled as if it were to be the root element.
Some top level elements can't be roots. They're intended to be the targets of element references. Elements with expressions (in asserts or OVC, etc.) that use upward relative paths that reach up and out of the element (back up past the root) cannot be used as root elements. Fortunately only a small number of tests had this.