dynamically determine aufs vs. overlayfs vs. other

This replaces the previous logic of checking for Ubuntu, and specific
versions, with dynamic detection of whether to use aufs or overlayfs.

If the filesystem is detected as aufs, it makes sure not to try mounting aufs
or overlayfs. This is because aufs cannot be mounted on a branch within aufs,
and OverlayFS *will* mount, but will fail to delete any files. This is because
aufs does not support xattr, which OverlayFS uses for whiteout.

Both aufs and overlayfs will be attempted, in that order. If neither can be
used, we fall back to the basic yet portable bind-mounting + copying strategy.
silence quotaon errors

these are used as conditionals; error is expected
don't use aufs if we're allowing nested warden
don't mount aufs or overlayfs in overlayfs

overlayfs can be mounted in overlayfs, but has the same whiteout problem as in
aufs. aufs mounts but has strange behavior.
clean up nested warden specs

* no longer install ruby with rvm; the ruby in the rootfs should be fine. this
  shaves many minutes off running the tests.
* with DEBUG=true, stream the output of the commands that are being run in the
  container. this gives more information when it fails than '1 should be 0'.
* destroy the outer container in cleanup
* don't trash dev/* in the rootfs. this only affects overlayfs in overlayfs,
  which will no longer be the case for these tests, as it will properly fall
  back to the copying + bind-mount mechanism.
only print exit status if debugging
oom diagnostics

Disable the oom killer for a container's memory cgroup when the
memory limit is set. If oom occurs later, the problem task (that
is, the one which attempting to acquire memory) will be suspended and
the oom notifier will be driven. This gives us the opportunity to
gather diagnostics while the problem task is still alive.

In the oom notifier, log memory statistics and re-enable the oom
killer to kill the problem task (or at least some task in the cgroup -
the oom killer is not entirely predictable).

Re-enabling the oom killer in the oom notifier is necessary in spite
of the fact that the oom notifier proceeds to terminate the container
since the current method of terminating the container can deadlock
when invoked in an "out of memory" state (wshd can require more
memory, e.g. for a stack frame, and be suspended). The oom killer will
typically kill the application and enable container termination to
successfully kill the remaining tasks via wshd.
Ignore IDEA .iml files