Delegate drawing to a custom drawer class that is looked up via
attribute, it will search for most specific drawer first, then walk up
the inheritence chain.
Currently it is not used anywhere and all the places making the
callbacks are passing ShaderRegeneration. Need to analyse which
properties actually causes ShaderRegeneration as well as actually use
this callback to regenerate shaders rather than checking against node
version.
* Move previewMode to RenderData instead of ShaderData (still some to do here, as apparently there's still a RenderData _and a_ ShaderData per node, but the intention was to have a RenderData per node and then share ShaderData between those)
* Introduce a temporary identifier for nodes. The first part of this identifier is an index (`int`) which is assigned linearly. When a node is deleted, its identifier as added to a free list. Each identifier also contains a version (`int`), which is incremented when the identifier is re-used. This allows us to replace usage of Dictionary with List in a lot of places.
* Introduce IndexSet for efficiently storing and manipulating a list of indices (e.g. from temp IDs). Internally this stores a list of 32-bit integers and uses each bit to represent 1 index. The operations of `ISet<int>` are implemented for this type, although that interface does not exist in Unity. The operations are very fast and cac...