refactored polymorphic() and coerce()

We need to support "q" as a signature; previously it wasn't possible.
Also, fixed a test: "f.[x]" must not be equivalent to "f.x"
implemented ~ for the case ~.q