made access work with slot-definitions as well as slot-names

 * accessing a slot by definition works and has tests
 * effects has-slot?, has-reader?, has-writer?
 * fixed long term bug in has-writer that would cause it to return
   incorrect results
made class slot functions accept lists of classes and return
mapcan/appended results

This was primarily to simplify code building up lists of direct-slots
to be excluded from serialization
fixed some bugs with has-reader? has-writer? and has-slot? introduced
in the previous patch
a couple obvious simplifications
use new appending function instead of mapcan (nconc is bad with mop results)
added todo
added more/better mop searching tests
suppress warnings from call-if-applicable, when called through access
also allow skipping calling at all from access keyword

This seems reasonable because generally we want access to work with
any type of key without complaint, so an integer key here shouldnt
trigger that internal warning.

Also being able to bypass the call part allows you to skip accessor
functions or trying to call if you know that you have keys and not
accessors
&rest some bindings
added get-slot-value which elides boundedness errors and supports calling with slot-defs
Made accesses allow specification of type which is particularly needed
on setting

eg: (setf (accesses foo '(:a :type :plist) '(:b :type :alist)) 15 )

Now works correctly even in light of foo being nil and the value of a
being nil.  This is important if something is expecting an ALIST and
is currently nil
fixed some nested if/whens with a typecase
ignore keyword and possible all symbols without @
merge with source