Distinguish top-level methods

The point of the PR is the commit that adds `MMethod::is_toplevel` to distinguish methods defined at the top-level of a module, with those defined in an explicit refinement of Object.

Such an information could be used by documentation tool to filter methods.

A following commit use the information to enforce that top-level methods redefine and are redefined only by top-level methods (by refinement). However, the rules in the model remains unchanged and there is no other use of the `is_toplevel` information in tools or execution engines.

The bunch of first commits are used to clean and improve the check of redefinitions used latter.