always create synthetic target when fixing common roots, unionize

scrooge outputs are shared across multiple thrift targets, and might overwrite files. Those different targets may have different dependencies, so you can't assume that a particular target in the list can own a particular root. You have to treat the dependencies as a union in all cases.

Testing Done:
ran unit tests, compiled large projects w/ overlapping scrooge gen dependencies.

Reviewed at https://rbcommons.com/s/twitter/r/1531/