Correctly quote operators

Putting an operator inside single quotes is the same as leaving off the
quotes.  To get the atom, one must wrap it in parentheses.
Don't use func sugar to define func sugar

For this to work, we must use the code that we're currently defining.
Although it does the right thing in some circumstances, it's fragile.
Add debugging statements

This will help me understand how function composition is proceeding and
whether it's behaving correctly.
Only apply func sugar to modules that request it

A module should only have `$` and `of` macros expanded if it's
explicitly requested expansion by importing library(func).

This avoids at least two kinds of unexpected behavior.

  * One module loads library(func) and a second module defines
    its own $/2 or of/2 predicates.  We used to expand those
    predicates as if they were macros but shouldn't have.

  * Loading two modules, each of which loads library(func),
    caused the second module not to receive our operator
    definitions.  That caused syntax errors while reading the
    second module.
Easier top-level debugging

Use this file with

    swipl -f dev.pl

so that loading library(func) loads the code we're working on.  It also
displays debugging messages for me.