close #3: use only IP address and port for endpoint identification

Technically we were already doing that; but this issue was an excuse to
refactor and clean up the code involving endpoint uniqueness.
close #2: treat "missing" token as empty token

Also cleanup validation and stringize for related problems.
endpoint: use uri_base as default for resolving relative URIs

Don't make the poor user pass this explicitly.
endpoint: get peer endpoint from host and port
endpoint: add create_request() helper method
coap: add global clock and transmission parameters
message: clean up MessageFormatError support

Add fields to hold the diagnostic text so the caller can programmatically
infer the cause of the failure (and an application can change them for
localization).

Also handle class 3 codes as being responses that have not been defined; 3
is not a reserved class as 1, 6, and 7 are.
message: add message type to MessageFormatError metadata
message: add source and destination endpoints
endpoint: support stringize and fix lookups with family=AF_UNSPEC
message: add endpoint to text representation
endpoint: add bound socket to endpoints

Will need this to be able to send messages to destination endpoints from the
source endpoint instance.