Keyword not found recommendations

For issue #888.
Isn't the above algorithm little different to what we discussed on irc earlier? If I got it right, this code creates a list with handler names both in short and full format and compares the given name to them. Wouldn't it work better that we test does the given name contain `.` or not, and then compare against either short or full names? Something like this:

    if '.' not in name:
        candidates = [name for _, name in all_names]
    else:
        candidates = ['%s.%s' % (lib, name) if lib else name for lib, name in all_names]
    return self._get_close_matches(name, candidates)

Also, putting result into a set is problematic because sets are un-ordered and thus priority between candidates is lost. I assume you used it for removing duplicates which simply isn't needed anymore with code like above.