Since all NodeInputs will generally only need their data type and default
value set once, we place it all into the constructor for cleaner and easier
to manage code.
Transitions are nodes but have a few parameters that are programmatic and always
required. This lets people write external code for transitions as well.