Break up compiler/prog_io.m.

Prog_io.m used to have three jobs.

- to manage the overall process of reading in the contents of source files;
- to search for the source files themselves; and
- to parse the top levels of items, particularly declarations.

This diff moves the code that does the second and third jobs into new modules
named prog_io_find.m and prog_io_item.m respectively. This improves the
cohesion of all three modules. It also moves the definition of the type
that records the result of the module-reading process into a new module
named prog_io_error.m, since several modules of the compiler need access
to it but not to any other part of the old prog_io.m.

compiler/prog_io_error.m:
compiler/prog_io_find.m:
compiler/prog_io_item.m:
    New modules, with contents as above.

    Note the faults of the module_error type.

compiler/prog_io.m:
    Remove the stuff moved to other modules.

    Document why the check_module_has_expected_name predicate is exported.

    Add a predicate (peek_at_file) to avoid exposing the details of how
    items are read to prog_io_find.m.

compiler/parse_tree.m:
    Add the new modules.

compiler/notes/compiler_design.html:
    Document the new modules.

compiler/timestamp.m:
    Move the type maybe_return_timestamp here from prog_io.m. This is to avoid
    situations where callers of predicates in read_modules.m need to import
    prog_io.m just for the definition of this type, just because the predicate
    in read_modules.m calls predicates in prog_io.m.

compiler/*.m:
    Conform to the changes above.