Reduce code differences

One of the technical goals of OpenZFS is to reduce code differences between the various platforms that support ZFS. To accomplish this, we will:
 * Create a "porting layer" to abstract out the platform-specific code. The "Solaris Porting Layer" (SPL) is a good start at this.  We can improve it by moving illumos/Solaris-specific code out of the main files and into platform-specific files.
 * Split the ZPL into platform-independent and platform-specific parts.
 * Long-term, consider if we can create a common repository to use for platform-independent ZFS code, rather than treating illumos as the de facto upstream repository.
 * Any code in this repo would need to be able to be tested in a platform-independent way (e.g. in userland using libzpool), so that changes tested on one platform can be expected to work on every platform.
 * Code tested by ztest would be the first candidate for this.
 * Userland ZFS ioctls would enable running /sbin/zfs and /sbin/zpool, and thus most of the TestRunner test suite against libzpool.

See Platform code differences for specific information on areas of divergence.