Remove dependency on WeakMap, hide private properties behind symbols