Stub class for stubbing method calls

This adds a stub class that can be used to stub method calls.  It
takes an object and method name and sets itself up on the object.
If given a block when created, that block will now be called in
place of _any_ method calls.  Calling `.with` on the stub adds
args-specific call stubbing.  Call `.teardown` to remove the stub
from the object.

Stubbing is noisy - it will complain anytime something seems off
(ie you stub a method the object doesn't respond to or add a with
stub with mismatched arity).

Stubs are safe to create on the same object/method repeatedly.  Stubs
are not overly smart - you define with a block and it replaces the
call - that's it.

This is the base object that does the stub logic.  In a future PR,
I'll add a helper method to make looking up stubs and interacting
with them easier.