[B+C] Add Merchant Trade API - Adds BUKKIT-5663

**The Issue:**

There is no way to modify Villager trades through the Bukkit API.

**Justification**


Without the API to allow for modifications being made on a Merchant's offers list, plugins have no Bukkit API way to affect trades, leading to messy uses of NMS classes and modified CraftBukkit classes, which can cause plugins to break or the server to crash. With an API, all plugin developers will be able to safely modify merchant trades (which as of current writing is only implemented through Villagers).

**PR Breakdown:**

The API adds the ability to retrieve current trades offered by a Merchant, add trades, remove trades and modify trades. There is also the added ability to influence event specific trades such that modified trades added to the MerchantTradeEvent do not alter the more permanent TradeOffers supplied by the Merchant.
In this sense: A MerchantTradeEvent's offers are a copy of the Merchant's offers that do not affect the Merchant's offers. However, the Merchant is still able to have their trades altered, but the MerchantTradeEvent will not be affected.

**Testing Results / Materials:**

Plugin code used to test: https://github.com/gabizou/TradeAPITest
Compiled Binary: https://dl.dropboxusercontent.com/u/9058563/TradingTest.jar

Steps to test:
- Spawn villager
- Interact with villager to bring up the Trade window

Console shows the debugging text

**Associated PRs**
Bukkit PR: https://github.com/Bukkit/Bukkit/pull/1077
CraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1393 

** Relevant PRs** 
Closed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/921
Closed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/833
Closed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/832
Closed CraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1240
Closed CraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1111

**JIRA Tickets**


Main ticket: https://bukkit.atlassian.net/browse/BUKKIT-5663
Subsequent (duplicate) tickets
https://bukkit.atlassian.net/browse/BUKKIT-3935
https://bukkit.atlassian.net/browse/BUKKIT-2138
Try this code.
```java
        ItemStack item = new ItemStack(Material.LEATHER_BOOTS);
        LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta();
        meta.setColor(Color.PURPLE);
        item.setItemMeta(meta);
        TradeOffer offer = TradeOffer.builder()
                .withFirstItem(item)
                .withResultingItem(new ItemStack(Material.COAL))
                .build();
        config.set("TradeOffer", offer);

        TradeOffer.deserialize(offer.serialize());
```
java.lang.IllegalArgumentException: Cannot copy null stack
	at org.apache.commons.lang.Validate.notNull(Validate.java:203) ~[craftbukkit-1.7.9-R0.3-SNAPSHOT.jar:git-Bukkit-1.7.9-R0.1-41-g80bd834]
	at org.bukkit.inventory.ItemStack.<init>(ItemStack.java:127) ~[craftbukkit-1.7.9-R0.3-SNAPSHOT.jar:git-Bukkit-1.7.9-R0.1-41-g80bd834]
	at org.bukkit.inventory.TradeOffer.serialize(TradeOffer.java:268) ~[craftbukkit-1.7.9-R0.3-SNAPSHOT.jar:git-Bukkit-1.7.9-R0.1-41-g80bd834]
	at test.TestPlugin.onEnable(TestPlugin.java:92) ~[?:?]
```