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

Implementing MetadataValue interface is significant work due to having
to provide a large amount of conversion stub method. 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-1460