General review, fixes and improvements

This commit comprises a number of minor fixes like idiomatic syntax,
updates and addition of new documentation (comments, etc) and broader
use of declared constants as opposed to just hex numbers in the code.

On the improvement part there's a new buffer pool used by the message
parser that got us ~1k ns/op in performance.

Back in the first versions the message parser would run at ~8k+ ns/op,
then dropped to ~6k ns/op by avoiding binary.Read. Now, with the addition
of the buffer pool it's doing ~5k ns/op. I'd like to get it closer to
the message writer, which is at 1 or 2k ns/op.

The problem with the message parser is that it has to decode every single
AVP in the message and this requires looking up the Diameter dictionaries
multiple times. Although the dictionaries are well index and such, the
amount of operations required to decode a full message is greater than to
encode it.

As usual, the tradeoff for performance is memory. Our pool will allocate
(or reuse) 1KiB buffers for decoding incoming messages. Previously it'd
allocate the exact amound needed per message but allocation takes time,
generates more garbage, etc.

If your client or server is handling messages that are bigger than the
buffer then the current implementation will be very inneficient. Also,
if your client of server only handles messages much smaller than 1K
it'll be a waste of memory.

The variable MessageBufferLength (in message.go) can be set in the
program initialization to change the default buffer size that is
allocated per message. Changing it on-the-fly will cause problems
so just don't.