Don't infinitely recurse on cyclic path deps

Instead, keep a table of what we've visited and halt recursion whenever we
re-visit a package.

Closes #77
auto merge of #86 : alexcrichton/cargo/issue-77, r=wycats

Instead, keep a table of what we've visited and halt recursion whenever we
re-visit a package.
Accept -j as a command-line parameter

This parameter will be used to control the number of concurrent builds that
cargo has executing.
Make CargoError inherit from Send

Due to a bug in the compiler, this also requires adding `+ Send` any time that
CargoError is mentioned. This change will allow errors to be sent across tasks.
Add a task-pool abstraction

The standard library also provides a task pool, but it's scheduling is not quite
the desired semantics. This task pool instead has all workers contend on a
shared queue to take work from rather than assigning new jobs to specific
workers for forever.
Add a dependency queue abstraction

This data structure is used to track when packages should be built and when they
become buildable. Additionally, it is used to propagate dirtiness throughout the
dependency graph.
Implement parallel compilation

This commit implements the -j flag in the `cargo_rustc` module, using the
primitives from the previous commits. The default parllelism is `os::num_cpus()`

This change also brings proper freshness propagation instead of the hokey logic
of once something is compiled, "compile everything to the right as well".