First attempt at no-spill shared stores
Refine work to reduce spills use for Store

Adds logic to deal with lvalues with side-effects via a pointer
temporary (based on Steven's advice).  Also refactors the logic for
contructing the runtime call to deal with the additional generality
of the new case (will ease more cases later, too).

This commity also fixes incorrect behavior in the previous code when
the RHS was an lvalue but didn't have the same type as the target.
The fix is a bit too conservative at the moment, as it requires a
spill for the case where the types differ only in signedness.
Continue refinement of spill-avoiding Stores

Work with added casts to avoid spills that are passed by reference
for the case in which the LHS and RHS have different types with the
same representaions.
For instance (int and unsigned int), (void* and intptr_t), etc.
Reorder Store logic from most to least desirable
Implement value-based Puts
Cleanup by grouping the related communication functions
Merge BuildUPCRLoad() and BuildUPCRLoadParts()

This is in preparation for work on issue-84 to generate
more efficient code for Loads.
Implement Loads using UPCR's value-gets when possible
Address Steven's comments and improve comments.  Refs #84.

The most significant change is the removal of cases in the Store
code that would reference either RHS or &RHS multiple times.  As
Steven observed, they could produce incorrect results if the target
of the store "influenced" the value of RHS (e.g. if the target
appears as part of an array index expression in RHS).
Reimplement UPCRCommFn in a proper C++ style
Merge branch 'issue-84'.  Resolves #84

* issue-84:
  Reimplement UPCRCommFn in a proper C++ style
  Address Steven's comments and improve comments.
  Implement Loads using UPCR's value-gets when possible
  Merge BuildUPCRLoad() and BuildUPCRLoadParts()
  Cleanup by grouping the related communication functions
  Implement value-based Puts
  Reorder Store logic from most to least desirable
  Continue refinement of spill-avoiding Stores
  Refine work to reduce spills use for Store
  First attempt at no-spill shared stores
Create BuildUPCRAdd{Pshared[I1],Shared}() to address issue #86

This commit factors all sites in the code which create calls to any
of the three pointer-to-shared addition routines.  By doing so, we
now can fold patterns of repeated arithmetic as are found in
accesses to multi-dimensional arrays.  Additionally 0-increment
addition is now squashed before it is ever created, allowing removal
of code from FoldUPCRLoadStore() that also squashed 0-increment
adds (but only when they appear directly in a Load or Store).
Need to overlook parens to find some addr arithmetic instances
Merge branch 'issue-86-v2'.  Resolves #86

* issue-86-v2:
  Need to overlook parens to find some addr arithmetic instances
  Create BuildUPCRAdd{Pshared[I1],Shared}() to address issue #86