rustpkg: Clean up usage messages for install
rustpkg: Handle non-numeric versions; some cleanup

Package IDs can now be of the form a/b/c#FOO, where (if a/b/c is
a git repository) FOO is any tag in the repository. Non-numeric
tags only match against package IDs with the same tag, and aren't
compared linearly like numeric versions.

While I was at it, refactored the code that calls `git clone`,
and segregated build output properly for different packages.
rustpkg: Don't assume a non-numeric refspec is a tag

Just pass it directly to git, without prefixing it with tags/
docs: Talk about tags that aren't versions in the "Package identifiers" section
auto merge of #8032 : catamorphism/rust/rustpkg-tags, r=graydon

r? @graydon    Package IDs can now be of the form a/b/c#FOO, where (if a/b/c is
    a git repository) FOO is any tag in the repository. Non-numeric
    tags only match against package IDs with the same tag, and aren't
    compared linearly like numeric versions.
    
 While I was at it, refactored the code that calls `git clone`,  and segregated build output properly for different packages.
A major refactoring that changes the way the runtime uses TLS. In the
old design the TLS held the scheduler struct, and the scheduler struct
held the active task. This posed all sorts of weird problems due to
how we wanted to use the contents of TLS. The cleaner approach is to
leave the active task in TLS and have the task hold the scheduler. To
make this work out the scheduler has to run inside a regular task, and
then once that is the case the context switching code is massively
simplified, as instead of three possible paths there is only one. The
logical flow is also easier to follow, as the scheduler struct acts
somewhat like a "token" indicating what is active.

These changes also necessitated changing a large number of runtime
tests, and rewriting most of the runtime testing helpers.

Polish level is "low", as I will very soon start on more scheduler
changes that will require wiping the polish off. That being said there
should be sufficient comments around anything complex to make this
entirely respectable as a standalone commit.
Have linked failure tests run on the new scheduler instead of requiring RUST_NEWRT to test.
Fixed a race where a scheduler configured to only run tasks pinned to it would "bounch" a regular task in and out of the work queue without allowing a different scheduler to run it.
minor tweaks - unboxed the coroutine so that it is no longer a ~ pointer inside the task struct, and also added an assert to verify that send is never called inside scheduler context as it is undefined (BROKEN) if that happens
updates to make the merged code compile and pass tests
std::rt: Use 2MB stacks

Seems to be around the minimum needed by rustc without split stacks
std::rt: Change Thread interface to require an explicit join

Makes it more obvious what's going on
std::rt: Add a ForwardTask message for sending tasks to Schedulers
std: Make SingleThreaded spawn mode work
std: Remove ManualThreads spawn mode
mk: Fix NO_REBUILD so stdtest can be tested without re-bootstrapping
std: Remove ThreadPerTask spawn mode. Unimplemented
std: Remove PlatformThread spawn mode. Obsolete
std: Remove ExistingScheduler spawn mode. Unused
std: Remove CurrentScheduler spawn mode. Unused