Nbt API

This is, in large part, a continuation of #49.

Currently doing some cleanup on the previous commits as well as adding an annotation-based serialization API.

Example usage for annotations:
```java
public interface BannerData extends NbtStored {

    @Nbt String getId();

    // The attributes of this compound tag are collapsed into this NBT data
    @Nbt(collapse = true) Vec3i getPosition();

    // Could be replaced with a TextColor, I'm not sure
    // 'Base' is set as the name
    @Nbt(name = "base") String getColor();

    // Nested data as a list
    @Nbt List<BannerPattern> getPatterns();

    // As an example, simple compound NBT data
    @Nbt BannerPattern getPattern();

    interface BannerPattern extends NbtStored {

        // Could be replaced with a TextColor, I'm not sure
        @Nbt String getColor();

        // Almost certain this is a string internally
        @Nbt String getPattern();

    }
   
  // force a getter
  @Nbt(type = NbtType.GETTER) String myprop();

  void setPosition(Vec3i pos);
  void setColor(String color);
  void setPatterns(List<BannerPattern> patterns);
  void setPattern(BannerPattern pattern);

}

public class Vec3i implements NbtStored {

    @Nbt int x;
    @Nbt int y;
    @Nbt int z;

}
```
How about an `UNKNOWN` type that can be returned if mc or an impl adds a new TagType that is not present yet in this list.