Clean up Minecraft interop code

Rather than attempting to anticipate and handle every
potential source of errors on the spot, we're instead
just going to wrap the potentially problematic functions
(essentially anything that reads from a socket) in a
single try/rescue block at the 'Protocol.read_request/1'
level (the primary external entry point for the entire
Alembic.Minecraft module namespace) and let the internals
fail at will.

We're also going to introduce a new 'defparser/2' macro
that can be used to define parser functions that take a
packet payload of a particular type and return a request
that the Alembic core plugin API can understand, thereby
allowing us to separate the specification of data types
and intended interpretation for each packet's payload.