WIP: Clean up properties and introduce type safety

This PR will allow us to catch issues like setting `plot.width = "800px"`, where `width` is declared as `Int` property. This is work in progress, so many things can be broken, thought tests surprisingly pass.

This PR needs:
- [ ] Tests, a lot of tests.
- [ ] Rewrite `Instance()` as `Instance(Type)`.
- [ ] Figure out how to type-check containers.
- [ ] Introduce abstract base classes where needed (e.g. `Tool`).