Since symbol lookup is not yet hooked up to the parser, this is not
currently usable. It will be hooked up in a follow-up.

This leaves some refactoring needs for the existing casting code: (a)
the existing reinterpret_cast support (which is special-cased as a
function call) should generate the new CastExprNode, and (b) the
existing "Coerce" function should be folded into the new general-purpose
casting function. These changes are noted in the code.

The VirtualAudioDevice mechanism, introduced by previous CL, unlocks
our ability to validate a number of areas that were previously
testable only with much difficulty and many caveats. This CL adds a
significant number of new test cases to audio_device_tests. This test
binary now essentially covers fuchsia.media.AudioDeviceEnumerator in
its entirety. The CL is test-only and contains no product changes.

[auth] Store system time on each token access and clear cache on backward jumps

This CL (a) guards against the highly unlikely event of significant backwards
systime adjustments by clearing the entire cache, minimizing the risk of handing
out invalid tokens, and (b) logs any such events for debugging purposes.

Make sure we only have a single async wait happening at a time in DefaultFrameScheduler.
This prevents the bug (SCN-1306) where a delayed frame can cause a second frame to
start rendering at the same time. It also makes it easier to reason about scheduling.

This change also makes related improvements:
- cm_rust adds a new type, CapabilityPath, for paths to make it easy to
get dirname/basename
- Tweak error classes so that cm_fidl_validator returns an error::Error
and cm_rust defines its own Error type
- cm_rust now represents `program` and `facets` as fidl (but keeps the
fidl_into converter). The reason being that componentmgr itself doesn't
consume `program`, it just needs to pass it along to the runner. It's
less clear at this point what should happen with `facets`, so I'm
making it a fidl for now to be consistent with `program`.

- Introduce the new FrameDestination type, expressing whether a
frame was destined to a unicast link-layer address or a broadcast
address
- Pass this as a parameter to ip::receive_ip_packet
- This functionality is exercised in a later commit, where ICMP
needs the information in order to make decisions about whether to
send an ICMP response (in particular, the RFC 1122 restrictions)

Log the attempted command again if we are about to fail a |CHECK| due to
a non-zero exit status. While it's technically possible to find this
information from the "Running ..." line above, there can be an arbitrary
amount of test logging in between that and the failure, making it
difficult to find when reading buildbot logs.

Also:
- Add tiny_mirrors replacements for cmake and pkg-config crates, which are
optional transitive dependencies of the harfbuzz and freetype crates, but which
we do not need or support in our build system.
- In //third_party/rust_crates/.cargo/config, add overrides to bypass building
the native harfbuzz and freetype libraries inside their wrapper crates, and
instead link to the versions of these libraries already built in our tree.