Fix Python 3 portability around str/unicode
Change exc_info to exception

Python 3 changes exception handling. It moves away from sys.exc_info by
storing sys.exc_info()[2] on the exception as __traceback__. Let's lean
that direction.
Undo extraneous porting

func.{__name__,__code__} are available in Python 2.