utils.debug: Improve @debug compatibility with other decorators
utils.debug: Improve @debug compatibility with other decorators

Now debug decorator is safe to use with almost any other decorator
(those that retrieve function's source code won't work though.)

IMPORTANT: debug decorator must be applied first, as it re-evaluates
decorated functions with all otrher decotators disabled.  So if a
function is decorated with @debug and @classmethod, like in the
example below:

 >>> @debug
 ... @classmethod
 ... def dummy(): pass

In this case  @classmethod won't be called at all.  Correct code would
be:

 >>> @classmethod
 ... @debug
 ... def dummy(): pass

TODO: Add an actual check of decorators order and raise an exception if
it is inproper.

edgedb/edgedb,edgedb/edgedb,edgedb/edgedb