Refactor SYMBOL-FUNCTION and %COERCE-CALLABLE-TO-FUN for performance.

This change replaces %COERCE-CALLABLE-TO-FUN's XEP type-check with
type-based dispatch, which neither ameiliorates nor worsens the
unfortunate discrepancy between what the runtime accepts vs. what
the compiler accepts in contexts expecting a function designator.

To clarify: %coerce-callable-to-fun looked like it took general names
due to the use of %COERCE-NAME-TO-FUN which *does* allow conses,
e.g. (%coerce-name-to-fun '(setf car)) => #<FUNCTION (SETF CAR)>
but looks are deceiving, because %COERCE-CALLABLE- was DEFKNOWNed
to accept only (OR FUNCTION SYMBOL).

However in places where the compiler is able to resolve a name to an
fdefinition, such as (MULTIPLE-VALUE-CALL '(SETF FROB) ...),
it accepts an "extended function designator".
This was brought up on sbcl-devel last October.

The result of this patch plus elimination of hash-based lookup
brings speed of FUNCALL via a symbol within a small factor of calling
a function object, as in the following quick-and-dirty test:

(defun try-known (f) (funcall (truly-the function f) 'baz))
(defun try-either (f) (funcall f 'baz))
(time (loop repeat 1000000 do (try-known #'identity)))  ; .008 sec, 15 Mcyc
(time (loop repeat 1000000 do (try-either #'identity))) ; .008 sec, 16 Mcyc
(time (loop repeat 1000000 do (try-either 'identity)))  ; .014 sec, 28 Mcyc

Previously, the 'try-either' test performed thusly:
(time (loop repeat 1000000 do (try-either #'identity))) ; .012 sec, 24 Mcyc
(time (loop repeat 1000000 do (try-either 'identity)))  ; .102 sec, 205 Mcyc