Updated cache_validation exception handler to catch all types of exceptions.

This change will catch and re-throw with the original stack trace, enhancing the exception message with the name of the pants target and location of the build file.

Was:
*** Running pants in dev mode from /Users/zundel/Src/pants/src/python/pants/bin/pants_exe.py ***

10:18:40 00:00 [main]
               See a report at: http://localhost:50651/run/pants_run_2014_05_22_10_18_40_62
10:18:40 00:00   [bootstrap]
10:18:40 00:00   [setup]
10:18:40 00:00     [parse]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [jvm-locate]
10:18:40 00:00   [bootstrap]
10:18:40 00:00     [bootstrap-jvm-tools]
10:18:40 00:00   [gen]
10:18:40 00:00     [thrift]
10:18:40 00:00     [scrooge]
10:18:40 00:00     [protoc]

               FAILURE
Traceback (most recent call last):
  File "/Users/zundel/Src/pants/src/python/pants/bin/pants_exe.py", line 175, in <module>
    main()
  File "/Users/zundel/Src/pants/src/python/pants/bin/pants_exe.py", line 169, in main
    _run()
  File "/Users/zundel/Src/pants/src/python/pants/bin/pants_exe.py", line 150, in _run
    result = command.run(lock)
  File "/Users/zundel/Src/pants/src/python/pants/commands/goal.py", line 234, in run
    return engine.execute(context, self.phases)
  File "/Users/zundel/Src/pants/src/python/pants/engine/engine.py", line 49, in execute
    self.attempt(context, phases)
  File "/Users/zundel/Src/pants/src/python/pants/engine/group_engine.py", line 278, in attempt
    phase_executor.attempt(explain)
  File "/Users/zundel/Src/pants/src/python/pants/engine/group_engine.py", line 170, in attempt
    execute_task(goal, self._tasks_by_goal[goal], self._context.targets())
  File "/Users/zundel/Src/pants/src/python/pants/engine/group_engine.py", line 141, in execute_task
    task.execute(targets)
  File "/Users/zundel/Src/pants/src/python/pants/tasks/code_gen.py", line 97, in execute
    with self.invalidated(gentargets, invalidate_dependents=True) as invalidation_check:
  File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/Users/zundel/Src/pants/src/python/pants/tasks/task.py", line 195, in invalidated
    invalidation_check = cache_manager.check(targets, partition_size_hint, colors)
  File "/Users/zundel/Src/pants/src/python/pants/base/cache_manager.py", line 217, in check
    all_vts = self._sort_and_validate_targets(targets)
  File "/Users/zundel/Src/pants/src/python/pants/base/cache_manager.py", line 242, in _sort_and_validate_targets
    cache_key = self._key_for(target, transitive=self._invalidate_dependents)
  File "/Users/zundel/Src/pants/src/python/pants/base/cache_manager.py", line 262, in _key_for
    return self._cache_key_generator.key_for_target(target, transitive=transitive)
  File "/Users/zundel/Src/pants/src/python/pants/base/build_invalidator.py", line 85, in key_for_target
    target_key = target.transitive_invalidation_hash()
  File "/Users/zundel/Src/pants/src/python/pants/base/target.py", line 179, in transitive_invalidation_hash
    target_hash = self.invalidation_hash()
  File "/Users/zundel/Src/pants/src/python/pants/base/target.py", line 162, in invalidation_hash
    self._cached_invalidation_hash = self.compute_invalidation_hash()
  File "/Users/zundel/Src/pants/src/python/pants/base/target.py", line 158, in compute_invalidation_hash
    return self.payload.invalidation_hash()
  File "/Users/zundel/Src/pants/src/python/pants/base/payload.py", line 112, in invalidation_hash
    sources_hash = hash_sources(get_buildroot(), self.sources_rel_path, self.sources)
  File "/Users/zundel/Src/pants/src/python/pants/base/payload.py", line 22, in hash_sources
    with open(os.path.join(root_path, rel_path, source), 'rb') as f:
  File "/Users/zundel/Development/java/build-support/pants_dev_deps.venv/bin/../lib/python2.7/posixpath.py", line 75, in join
    if b.startswith('/'):
AttributeError: 'Fileset' object has no attribute 'startswith'

Now:
  ...

  File "/Users/zundel/Src/pants/src/python/pants/base/target.py", line 158, in compute_invalidation_hash
    return self.payload.invalidation_hash()
  File "/Users/zundel/Src/pants/src/python/pants/base/payload.py", line 112, in invalidation_hash
    sources_hash = hash_sources(get_buildroot(), self.sources_rel_path, self.sources)
  File "/Users/zundel/Src/pants/src/python/pants/base/payload.py", line 22, in hash_sources
    with open(os.path.join(root_path, rel_path, source), 'rb') as f:
  File "/Users/zundel/Development/java/build-support/pants_dev_deps.venv/bin/../lib/python2.7/posixpath.py", line 75, in join
    if b.startswith('/'):
pants.base.cache_manager.CacheValidationError: Problem validating target squarepants.hack-protos.src.main.proto.proto in squarepants/hack-protos/src/main/proto: 'Fileset' object has no attribute 'startswith'

Testing Done:
This is just a diagnostic - I hope we cache problems like this explicitly before it comes down to an unexpected problem in validation.  I updated the exception handling to help me track down which BUILD is causing a problem after the refactor... I'll track down that issue separately.

Bugs closed: 145

Reviewed at https://rbcommons.com/s/twitter/r/396/