Initial changes for DLL support.

The CMake build system has been modified to produce library-specific
headers with various macros supporting DLL creation.  The major
difference between a DLL on Windows and a .so on Linux (at least when
developing) is ensuring that appropriate code is "exported" for client
use.  This is done implicitly in .so creation, and the code actually
needs to be modified for doing this exporting.  This is implemented
using architecture-dependent macros facilitated quite a bit by built-in
CMake macros.