(PUP-3239) Refactor node environment validation

Prior to this, the compiler was responsible for testing the environment
and producing an error message.  This change pulls the validation step
into node environment, breaking the error message up so that any
component can check if an environment has setting conflicts and return a
uniform error message.  This will make it easier to add other
environment checks.

We refrained from including a more general error message handling
mechanism similar to what is currently in POPS because generalizing that
is a bigger task more suited to a broader internationalization epic.