Added a benchmark file for performance of gen:dict and gen:stream generics.
Added a #:derive-property option to define-generics.

The define-generics form can now derive existing struct properties, so that any
instance of the new generics group is also an instance of the struct property.
Separated prop:dict from gen:dict and prop:stream from gen:stream.

This work is in preparation for widening the interfaces of gen:stream and
gen:dict with operations like dict-for-each, sequence-andmap, etc., each with
a fallback implementation.  The exported properties, with their documented,
fixed-length vector representation, cannot be extended, whereas a generic with
optional methods can be.
Added #:fast-defaults option to define-generics.

For datatypes that are disjoint with structs that might implement the generic,
this adds a "fast path" implementation that doesn't need to test for struct
properties.
Changes to define-generics: added #:defined-predicate; improved generated code.

The #:defined-predicate option is like #:defined-table, but it defines a
two-argument predicate that only processes the requested method name and doesn't
allocate a hash table each time it is called.

Method implementations provided via #:fallbacks, #:defaults, and #:fast-defaults
are now called directly by method procedures rather than stored in a vector and
extracted by index.  This should hopefully improve inlining for methods.
Added #:dispatch option for clauses in #:defaults and #:fast-defaults.

The #:dispatch option specifies a second, less strict predicate for a #:defaults
or #:fast-defaults clause.  The main predicate is still used for the generics
group's type predicate, but the dispatch predicate is used in choosing which
method implementation to use.  The #:dispatch option is useful when the dispatch
predicate is disjoint from all other instances, is significantly cheaper to run
than the main predicate, and the full checks can be meaningfully deferred in
method implementations.

Specifically, this is useful in the implementation of iteration for
association-list dictionaries.  The dict-iterate-{next,key,value} functions do
not need to test (andmap pair? dict) if the given dict is eq? to the one stored
in the given iterator.  The dispatch predicate, list?, is much cheaper.