Right now symbol tables store things like __call and __construct alongside user-provided symbols. This forces us to mangle/unmangle symbols that start with two underscores. Instead, symbol tables should keep a map of user-provided symbols as before, but also provide optional properties for internals like __call et al.
When the symbol() type becomes available, the symbol table should also include an "dynamic names" map in addition to the "user-provided names" map.