reader changes, other minor changes

Change the spool reader function. It now takes a file name as any
valid pathspec that TRUENAME can resolve and optionally a UID to limit
to. When given a UID, it only returns that page (or null, if it
doesn't find it). When not given a UID, it returns a list of the
entire spool in reverse order (end of file at front).

The spool reader function has been simplified greatly as well... but
it's still really long...

Change the record start marker from "#!#SML!POSTED!not-for-mail" to
the less clumsy "#!#SML!POSTED". Hopefully just as unique in the
spool. This is not backwards compatible with the old parser. Rewrite
the spool. Use regular expressions if necessary.

On to the details.

The sample spool file mentions caching. This is coming up, as this
commit was getting a bit large.

A little fandango on export going on. This will be corrected.

A condition is defined but never used. Again, the commit was getting
long.

A new slot %WRITE-DATE on `sml-page'. This is part of caching.

VALID-MESSAGE-UID-P: Check to see if UID is a valid universal ID.

MESSAGE-UID: Given a SUBJECT and DATE, return the UID. The length has
been increased to provide a bit more collision protection.

In the pretty printer, also print the UID.

Change: READ-SML-PAGES has been replaced by the more powerful
READ-SPOOL. One takes a stream, and the other takes a pathspec, so
watch out.
split read loop into own function

Split the actual loop component of the spool reader into its own
function %READ-LOOP. Now you can understand what READ-SPOOL is doing.

The idea that one day I'll write the spool functions to be extensible
depends on people being able to understand how things are getting
passed around. When /I/ can't keep track of what's going on, that's a
bad sign.
package exports and UID validator

Change: Remove outdated package exports (one of which never even saw
the light of day!) and add READ-SPOOL and VALID-MESSAGE-UID-P.

Change: VALID-MESSAGE-UID-P now returns the UID on success instead of
the PPCRE scan results.
Merge branch 'unstable' into testing

Compiles fine, needs further testing and cleanup.
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
Merge branch 'testing'

All exported code has been tested. If something is not exported, it
hasn't been tested and is likely to change. Once features near
completion this shouldn't happen as often. Ignore the file
``cache.lisp'' for now.

The big changes:

- Message separator shortened to "#!#SML!POSTED". This is not
  compatible with the previous separator.
- Change spool reader to generic function READ-SPOOL.
- Package Exports
  - Remove slot names.
  - Add UID validator.
- Add basic caching operations MESSAGE-OUTDATED-P,
  SPOOL-CONTAINS-UID-P, and SPOOL-DATE.
- Tidy the code a bit. Things like moving into files based on
  abstraction.