dtd: underscore is valid in entity names

We where failing is_valid_accesskey when entity name contained _ which
would remove a leading & and make the entity invalid.
dtd: optional expected makes cleaner roundtrip setups
accesskeys: test numeric keys
accesskeys: test combining non-ASCII keys

The function actually claimed to return Unicode but was converting to a
basestring.  So this also drops that conversion to basestring.