Implement the merging of data states.

This allows values and types to propagate through the program correctly so
that the preprocessor can figure out which operator implementations to
use, and eliminate branches we know can't be visited at runtime.