Refactoring: abstracted out property tables

In the process, this makes nodes completely private, and only exposes concrete implementations.
I am going to solve this and allow nodes in client languages with a specific type rather than a generic one.