<Packet Header>
Packet Length - VarInt
Data Length - VarInt
<Compression Header (see https://datatracker.ietf.org/doc/html/rfc1950)>
Compression Method - 4 bits (should be 8 for deflate (?))
Compression Info - 4 bits (should be log2 of LZ77 window - 8 for CM = 8)
// the following 3 might be reversed, the spec is..... weird
Compression Level - 2 bits // 0 -> fastest, 3 -> slowest, best compression, 2 -> default
Preset Dictioniary - 1 bit
Check bits for previous entire header - 4 bits (must be so when taking the entire header as 16 unsigned integer, it's a multiple of 31
	<If Preset Dictioniary is set> - probabably won't be
	"A series of bytes" (undefined size) that make up an ADLER32 checksum.
	This CAN be used by the decompressor to identify the dictionary used.
	// unsure whether we need this?


- The way I think parsing the header can work is:
	1. Read entire header as ushort
	2. extract check bits, verify (header % 31 == 0)
	3. extract rest of header values
	
<DEFLATE>
https://datatracker.ietf.org/doc/html/rfc1951

FINAL - 1 bit, if this bit is set, stop reading after this. 
(- how do we handle a case where the packet length is past the final block?!)
Type - 2 bits, where (00 = no compression, 01 = fixed Huffman codes, 10 = dynamic huffman codes)
NOTE: FOR SOME STUPID FUCKING REASON BLOCKS DON'T HAVE TO BE ALIGNED TO BYTE BOUNADRIES - WE HAVE TO KEEP TRACK OF EVERY SINGLE FUCKING BIT

either of the three block specs follow now

the adler hash follows now




