Ksp field using new suffixes

Support for KSPFields, KSPEvents, and KSPActions.
========================================

API:
-----

Given P which is a PartValue,

SET NAMES TO P:MODULES. // NAMES is now a LIST() of module string names on the part.

SET M TO P:GETMODULE("SomeName"). // M is now an object of type PartModuleFields.

Given M which is of type PartModuleFields:

### KSPFields:

SET FLIST TO M:ALLFIELDS. // FLIST is now a LIST() of KSPField names on the part's partmodule, using the fields' GUI names.
SET VAL TO M:GETFIELD("SOME_NAME"). // Val is now the value of KSPField with GUI name = "SOME NAME" (case insensitive).
M:SETFIELD("SOME_NAME",VAL). // KSPField with GUI name = "SOME NAME" (case insensitive) now has value VAL.

### KSPEvents:

SET ELIST TO M:ALLEVENTS. // ELIST is now a LIST() of KSPEvent names on the part's partmodule, using the Events' GUI names.
M:DOEVENT("SOME_NAME"). // Fires KSPEvent with GUI name = "SOME NAME" (case insensitive).

### KSPEActions:

SET ALIST TO M:ALLACTIONS. // ALIST is now a LIST() of KSPAction names on the part's partmodule, using the Actions' GUI names.
M:DOACTION("SOME_NAME",TRUE). // Sets the KSPAction for the partmodule's action called "SOME NAME" to TRUE (Same as toggling an action group ON, except that it affects only this one item individually).
M:DOACTION("SOME_NAME",FALSE). // Sets the KSPAction for the partmodule's action called "SOME NAME" to FALSE (Same as toggling an action group ON, except that it affects only this one item individually).

NOTE, IF you grouped together parts into the same action group in the VAB, then I Think using DOACTION actually will fire the whole group, not just the one item.


Still just a proof of concept, but what's there is working.

Strange, I dont know how my clipboard had a value that never existed

    return attribs.OfType<UI_Control>().Where(obj => (obj).controlEnabled).ToList();

That is the actual replacement