Ipns name resolution

This branch is not yet complete, but before i move forward, the name resolution code (in namesys) needs some critiquing. There are also a decent number of bugfixes in this branch that i ran into while trying to get the code to a point where i could test ipns.
That introduces opportunities for human error. 

1) Rather than getting an informative, specific error about why it couldn't resolve, you'll receive something bubbled up from a third-party library. Will be harder to debug.

2) The API usage procedure becomes more complex. Rather than thinking of `Matches` as an optimization that allows you to avoid remote calls, it becomes another thing you are forced to consider when trying to resolve the name. 

From a perf persective:

1) Resolve shouldn't make a network call if it knows that the resolve will fail due to malformed input that it can detect beforehand. If one resolver must do this, then shouldn't they all ought to do this for consistency in the interface?