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.~~ EDIT: make this another issue.
- [x] Rewrite `Instance()` as `Instance(Type)`. EDIT: ~~not really feasible right now due to visibility and cyclic imports issues~~. EDIT2: actually it wasn't that hard (with a little help from `importlib`). 
- [x] Figure out how to type-check containers.
- [x] Introduce abstract base classes where needed (e.g. `Tool`).