Build: Static constructors for built-in providers

Change how internal and external providers are built to fix static
build issues.  External providers are now required to export a
well known API that is invoked by the libfabric framework.  This
replaces the fi_register call that libfabric exported.

Update the build configuration to better handle building in-tree
providers as separate DLLs (for testing purposes).  When building
an in-tree provider as a separate DLL, it now needs to export
the required fi_prov_ini function.

Signed-off-by: pmmccorm <patrick.m.mccormick@intel.com>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>

Replaces PR #335
Would also be good to have some kind of conditional / debug output here saying that a provider didn't match the major/minor and was therefore ignored.  I speak from experience: OMPI users send mails to our mailing list wondering why a given plugin was unexpectedly unused: "the plugin is there; why isn't OMPI using it?".  Having a diagnostic way to print out why something is / is not being used is quite useful out in the field.