control.py: Fix race conditions if multiple colors updated.

If multiple colors were being updated rapidly, later updates could
overwrite earlier updates. Now we track all target colors so they are
preserved as needed.

Also split up component validation to make the code a bit more
readable.