Refactor conversions from LazyMetadataValue into abstract base class (BUKKIT-3624)

Implementing MetadataValue interface is significant work due to having to provide a large amount of conversion stub methods. This adds a new optional abstract base class to aid in implementation, and has LazyMetadataValue extend this.

Includes comprehensive unit tests including a sample adapted class, and all existing metadata tests pass as well.

This supercedes an older pull request https://github.com/Bukkit/Bukkit/pull/580

Also see associated Atlassian ticket: https://bukkit.atlassian.net/browse/BUKKIT-3624