Support for global variable arguments in USDT probes

I previously thought it wouldn't be possible to probe arbitrary user-mode addresses,
but it turns out that it is. This was required to support global variable arguments
in USDT probes. For example, there are a few probes in libpthread whose arguments
refer to the mp_ global variable. These are now supported.

Additionally, refactored process-related utils into a ProcUtils class in procstat.py,
and implemented a version of `which` (`ProcUtils.which`) that is as portable as
possible -- it only relies on traversing the PATH environment variable.
diff --git a/tools/trace.py b/tools/trace.py
index c5ec39c..fdcc3dd 100755
--- a/tools/trace.py
+++ b/tools/trace.py
@@ -331,7 +331,8 @@
                         prefix = self.tp.generate_get_struct()
                 elif self.probe_type == "u":
                         signature += ", int __loc_id"
-                        prefix = self.usdt.generate_usdt_cases()
+                        prefix = self.usdt.generate_usdt_cases(
+                                pid=Probe.pid if Probe.pid != -1 else None)
                         qualifier = "static inline"
 
                 data_fields = ""