Make soyweb.sh work on OS X without needing a patch.

Summary:
`soyweb.sh` should usually run with a `ROOT` of `/buck/`
unless it's running locally to test documentation.

Test Plan:
Fake it: CSS and links are broken.
Run it normally, locally, and everything works without needing a patch.
Fix path separator in JUnitTest.

Summary:
Changed hard-coded `:` to `File.pathSeparator`.
On Windows path separator is `;`.
Fixed `JUnitTest` on Windows.

Test Plan: Unit tests.
Fire a log event when we spot duplicate files/directories when building an uberjar.

Summary:
First we failed completely for the duplicate entries,
and we said nothing (other than catastrophic build failure).
Then we succeeded silently, dropping the duplicate entries,
and we said nothing.
Then we fired log events when we saw duplicate entries,
and so we say something.

This is in response to a request on the buck mailing lists to make it visible
when duplicate files/directories are encountered when building an uberjar.

Test Plan: buck test --all
Add a deps argument to prebuilt_native_library().

Summary:
This turns out to be a useful option when there is a runtime
dependency that should be associated with the prebuilt_native_library.

Test Plan: Sandcastle builds.
Second run at handling creation of symlinks on Windows.

Summary:
Creating symlinks on Windows is _hard_. Files.createLink only works on files, but it's possible
for us to get given a directory to symlink. Handling this on XP requires escalated privileges
and isn't recommend. With this diff we:

* Create a symlink directly if we're not on Windows.
* If we're on Windows and we're linking a file, create a link
* Otherwise, recursively copy the directory.

That last step means that linking to a directory will be very inefficient on Windows.

Test Plan: buck test --all
If the user-specified message to an assertion is non-null, still include the generated message.

Summary:
Previously, ProjectWorkspace.ProcessResult.assertExitCode(message, exitCode) would
not tell the user what the observed exit code was if message were non-null.
In the style of org.junit.Assert.assertEquals(message, expected, observed), if
message is non-null, it is prepended to JUnit's built-in messaging about the
inequality between expected and observed.

Test Plan: Sandcastle builds.
Delete stale metadata when an artifact is loaded from the cache.

Summary:
This diff fixes `DefaultJavaLibraryRule` so that it deletes metadata files
when an artifact is fetched from the cache to eliminate potential
corruption issues. Unfortunately, the absence of this metadata means
that future builds of the `DefaultJavaLibraryRule` rule may be suboptimal,
as the rebuild could be avoided if the metadata for the artifact were known.
Currently, we need a short-term fix, but the correct long-term fix is to pull
down the new metadata with the artifact so that the metadata on disk
can be replaced instead of categorically deleted.

Ultimately, we are going to create a framework for storing and loading
additional files and data for a build rule so that such transactions with
the artifact cache are atomic. Hopefully this will eliminate an entire class
of corruption issues.

Test Plan:
Wrote `CachedTestIntegrationTest` first and verified that it failed.
However, when `mode = dir` was commented out in the `.buckconfig`
file, the test would pass. This demonstrated that the problem was
due to a bad interaction with the build cache.

Then made the fix in `DefaultJavaLibraryRule` and verified that the
test passed, as expected.
Move reporting of test results to a listener.

Summary:
Make it possible to register new ways of capturing test results without needing to modify
buck itself by converting the existing output mechanism to something that uses the event
bus.

Test Plan:
buck test --all
Console output looks like it always used to.
Push Buildable interface down to child classes of AbstractCachingBuildRule.

Summary:
Next step in the plugin work. We would like the AbstractCachingBuildRule to ultimately
be a wrapper around Buildable instances. In order to do this, things that currently
extend it need to implement the newly introduced Buildable interface.

We could attempt to mash the change where the Buildable is a field in the
AbstractCachingBuildRule but that turns out to be a wide ranging change that impacts
a lot of code. In addition, we still need a way to annotate Buildables as being
either TestRules or AndroidLibraries.

Test Plan: buck test --all
Eliminate the concept of non-idempotent RuleKeys.

Summary:
Now, if there is any non-idempotency, the build will fail instead of
marking the RuleKey as non-idempotent.
Strengthen AbiRule.getRuleKeyWithoutDeps() so it returns a non-null value.

Summary:
AbiRule.getRuleKeyWithoutDeps() should fail only if it cannot compute the
hash of the contents of an input file. When that happens, IOException is
thrown, and it is the user's fault, so we should guarantee that when
AbiRule.getRuleKeyWithoutDeps() returns a value, it is non-null.
Fix unit test AndroidResourceRuleTest.

Summary: Normalize path separators for string patern matching.

Test Plan: Unit tests.
Standardize on ProjectWorkspace.ProcessResult.assertExitCode().

Summary:
Because `assertExitCode()` prints out a very useful error message when
it fails, it should be preferred over `assertEquals(0, result.getExitCode())`.

Test Plan: Sandcastle builds.
Fix path inconsistency in RepackZipEntriesStepTest.

Summary: Unify to `getAbsolutePath()`.

Test Plan: Unit tests.
Fix directory separator inconsistency in TargetsCommandOptionTest.

Summary: Unify them to enable path string pattern matching.

Test Plan: Unit tests.
Fix directory separator inconsistency in TargetsCommandTest.testJsonOutputForBuildTarget.

Summary: Unify to slashes.

Test Plan: Unit tests.
Unify line separators in MergeAndroidResourcesStepTest.

Summary: Replace CrLf with Lf.

Test Plan: Unit tests.
Fix directory separator inconsistency in AndroidBinaryRuleTest.

Summary: Unify to slashes.

Test Plan: Unit tests.
Introduce DebuggableTemporaryFolder.

Summary:
Frequently, when debugging an integration test,
I do not want the TemporaryFolder to delete itself at
the end of the test because I want to be able to inspect
its contents. A DebuggableTemporaryFolder provides the
option to do just that.

This also updates ProjectWorkspace to require a
DebuggableTemporaryFolder so that developers will start
using this by default.

Test Plan: Sandcastle builds.
Fix path inconsistency in AbstractCommandOptionsTest.

Summary: Unify to `getAbsolutePath()`.

Test Plan: Unit tests.