Tracing out-of-scope function calls

Problem: log every time a generic function Base.f is called, anywhere, where at least one of the arguments is of type T.

At Invenia we’ve been having a long conversation about how one might do this. See a related issue here: https://github.com/invenia/Trace.jl/issues/2

This can be done simply in specific cases (e.g. Number arithmetic) where there is a promoting fallback function, or where there is not an existing function ambiguous with f(x...), but in other cases I’m not sure this is possible.