Implementation:
- Keys: addWidget('text') with custom serializeValue()
- Values: addInput() for connection slots
- onSerialize: saves dynamic key widget values to node properties
- onConfigure: restores key widgets on workflow load
This allows keys to be pure editable text boxes (not forceInput)
while still being properly serialized and restored.