Refine uses multiple dispatch

Builds off of https://github.com/sympy/sympy/pull/2979

Previously `refine`, a simplify function for new assumptions, used it's own custom dispatch system.  This PR shows how multipledispatch can do this instead.

Note that this is single dispatch which is probably something of an anti-pattern.  Probably we should depend on standard instance methods for this sort of thing (i.e. `_eval_refine`).  I suspect that this was not done in the past because it would inject a lot of non-core code (assumptions) into the core.  Maybe we should revisit this if new(er) assumptions reaches the core.