Handle stubbing a method on a parent and child in the same test

This fixes a rare bug with stubbing a method on a parent and on
its child. When the same method was stubbed on the parent was
first, and then on the child, it would cause issues with tearing
down the stub, when the parent was torn down before the child.
Since assert typically automatically tears down all stubs after
a test, you don't control the order and don't want to.

This fixes the issue by insuring the parent and child don't share
stubs. This is done with a few changes. Firstly, the stub method
is namespaced to the object the stub is being done on. This way,
when the stubs are torn down, they don't remove each others stub.
Next, the condition for defining a local pass-through is limited
to only `Module` or `Class` objects, no instances. It also no
longer uses `respond_to?` because this will see an inherited
method and not define the local method. If the local method is not
defined, then, when the same method is stubbed on a parent, it
will be alias the parents stub method as the "original" method.
This causes issues when torn down because it restores the parent
stub method as its "original" method. Finally, to avoid arity
issues with using `define_method`, the stub method is now defined
using `class_eval` and a string. This ensures the arity of the
stub method doesn't return `1`. This change required storing an
instance of the stub on the object being stubbed and then looking
it up and calling it in the stub method. This ivar is added and
removed properly as well.

All of this fixes issues with stubbing inherited methods in the
same test. The typical use-case for this is stubbing `new` on
a parent class and a child class.