Bidirectional no longer thread safe

Removed concurrent dictionaries
ReSharper Formatting: EventInput
Added single player input extensions
Added iteration for FullFileBuffer
Byte array and serialization changes

- Added a bunch of extension methods for converting primatives to byte
arrays
- More Read/Write methods for streams so that we don't have to specify
startIndex, length when writing entire byte arrays
- Added WithTermChar method for strings so implementing code clearly
explains why we are appending a character to the string
- Moved GetByte methods from StringAndRegexExtensions to
ByteArrayExtensions and renamed to AsByteArray to match convention
- New interface IByteSerializeable for de/serializing objects from/to
byte arrays.  The end index is returned from the "FromByteArray" method
so that the ByteArrayReader can easily read objects.  See next commit.
- WithSizePrefix extension for byte array so that we don't have to keep
checking sizes on arrays wherever we use them.
Packet overhaul

- ChatPacket, ServerInfoPacket gone.  Either too general and boilerplate
for some cases, or too restrictive for some servers.  Either way, not
helping anyone.
- Packet now implements IByteSerializeable, so that we can easily read
using a ByteArrayReader.
- Packet now has two static functions: GetTypeFunction and
GetNameFunction.  GetTypeFunction takes an int (the 4-byte field at the
beginning of a packet byte array) and returns the string of the class
that a mapping scheme knows that packet by.  GetNameFunction does the
reverse (take a packet class name and return it's int code.)  These are
implemented so that the readonly property Packet.Type can be implemented
once and each implementation can define its own mapping between integer
codes and classes.
- The old Type property has been accordingly gutted.
- Removed unnecessary helper functions (fromInt etc)
- GetHashCode uses the ByteArray's hash code.
- Equals uses GetHashCode
ReSharper Formatting: MathFunctions
IByteSerializeable, ByteArray Builder/Reader

IByteSerializeable: Serialize to a byte array, and load from one.
FromByteArray returns the index of the end of the object deserialized,
so that ByteArrayReader can easily track objects of arbitrary length.
Should return a negative integer if the data starting at startIndex is
not an appropriate type object (trying to deserialize a car object, but
data is actually an animal object)

ByteArrayBuilder: StringBuilder for byte arrays.  Supports
IByteSerializeable interface

ByteArrayReader: Allows you to sequentially read objects from a byte
array.  Each read starts from the end of the previous, so that you don't
have to manually track the pointer.  In some cases, this removes the
need to know the length of the object entirely (e.g. well-formatted
strings)
BasicServer updated to new interfaces

ClientThreadFunction no longer gates for authenticated messages.
ReceivePacket should, when overloaded, read and properly handle
authentication packets.
ReSharper Formatting: ColorTextureGenerator
Dictionary<TKey1, TKey2, TValue> added

Doesn't try to use defaults, simple multi-key dictionary.  Doesn't
support iteration.
Client reformatting, uses new interfaces

- Minor ReSharper reformatting
- Now uses stream.WriteWithHeader(byte[]) overload
Dropped Client.ReadPacket method

Client has no need for knowing what type of packets the byte arrays it
reads are.  Moved the conversion back to the Server, and improved its
null handling in ClientThreadFunction