Make tracepoints work with older GCC

Linux tracepoints support is broken with older versions of GCC (e.g. GCC
4.4.7 on RHEL6). To accommodate having one monolithic trace.h file, we
used typedefs to avoid 'unknown type' errors compiling C files that didn't
include the headers that define the type in question. This meant,
however, that duplicate typedefs were defined with the same type for C
files that _did_ include the header for that type. This duplication is
permitted with newer versions of GCC (e.g. v4.6) unless pedantic error
checking is in force. But it is an error on older versions and causes
build failures when Linux tracepoint support is enabled.

Removing the typedefs requires that the code using those types is only
compiled if the types have already been declared. To facilitate
detecting if those requirements are met, we define preprocessor macros
at the end of each required header. These macros are then used as #ifdef
guards in the tracepoints code so each event is only declared if its
dependencies are met.

As an extra complication, the trace.h header is (indirectly) included
from zfs_context.h. This is convenient because dprintf() and SET_ERROR()
are made readily available throughout the code base. It does mean,
however, that trace.h may be included before all the headers required by
the DTRACE_PROBE events. We therefore refactor trace.h to move
declaration of such events outside of the multiple inclusion guard, and
C files using DTRACE_PROBE* may need to explicitly include trace.h after
the required headers.

Signed-off-by: Ned Bass <bass6@llnl.gov>
Break trace.h out into multiple headers

This commit refactors sys/trace.h into multiple header files to improve
readability and manageability. There are no functional changes.

Signed-off-by: Ned Bass <bass6@llnl.gov>