basic interface for message caching

SPOOL-DATE: Given a spool designator, return its modification time or
NIL if the spool designator is invalid.

MESSAGE-OUTDATED-P: Given a spool designator and a message, return the
modification time if the file is outdated. Otherwise, return NIL. (If
the function were to return non-NIL on an invalid spool designator,
caching functions may try to reload it, which obviously won't work too
well.)

Further caching operations will build off these two functions.
* some quick refactoring

Some refactoring to make the caching code be a bit more coherent.
test spool for UID

SPOOL-CONTAINS-UID-P: If the spool contains the given message
universal ID, return the ID. For quick scanning to see if the cache
mechanism should bother trying to read a spool for a given UID.
Merge branch 'cache' into testing

Primary caching functions that operate at the spool level. Compiles,
needs further testing.
initial caching work

Some initial work into caching. Needs cleanup. The idea is that there
is a hash table that SML-PAGE messages are stored in. When you go to
read one (based on its UID), the caching mechanism detects if the
spool has changed since the last read in. If it has, reload the
message from the spool Otherwise, serve it from memory.
more caching

Greatly simplify interface for reading messages from cache. Use
:AROUND and :BEFORE methods for preparation and global checking.

In ``spool.lisp'' add a method to MESSAGE-OUTDATED-P for fallback on
an invalid spool specification.
better header mapping and UID checking

Mapping over spool headers is now done using the generic function
MAP-HEADERS.

Add an :AROUND method to SPOOL-CONTAINS-UID-P to validate the UID
argument.
remove slot name exports

Remove slot names from the export list.
Merge branch 'cache' into testing

Conflicts:
	sml.lisp
test exported functions

bugfix: MAP-HEADERS evaluating FUNCTION twice