Reduce client project build churn

We were already using a preinstall script to work around npm's
default behavior of always forcing a "node-gyp rebuild" for modules
that contain a binding.gyp.  Instead, we were doing a "node-gyp
configure" followed by a "node-gyp build".  While this avoided
redundant compilation (the generated Makefile does the right thing),
the timestamps on the Makefile were still being updated by "node-gyp
configure" even though the contents of the Makefile were unchanged.
This was causing extra work to occur in downstream make rules in
some client projects.

Here we bust out the preinstall step to a separate script, and
further elaborate it with logic to skip the "node-gyp configure"
unless the Makefile is missing or out of date wrt. the binding.gyp.