Added system#bypass_dryrun

This can be used by functions running in dry-run mode when they really
do need to make changes. For example, the fetcher needs this to unpack
downloads to a temporary directory, even though they are never actually
added to the cache.
Made recipe 'dest' argument type-specific

Although <file> and <archive> both have a dest attribute, it's only
optional for <archive>.
Better error reporting in unit-tests
Simplified a private fetcher API
Moved some generic test functions to fake_system.ml
Migrated download_implementation logic to OCaml