Message version support

Adds message versioning support to EasyNetQ

Docs at https://github.com/randomcodenz/EasyNetQ/wiki/Versioning-Messages

Potential issues 
- has only been tested with Pub/Sub
  - As outlined in docs it should not be used with request / response or send/receive but there is nothing stopping this; not entirely sure if we should.
- Will not work with FuturePublish at this time
  - dead letter exchange approach could be modified reasonably easily 
  - due to the additional metadata requirements the scheduler approach will require a breaking change in the database schema or scheduled sending code. Thoughts?
 - We could simply check for `ISupersede<>` in all of the future publish methods and throw an exception as a temporary measure (fail fast rather than failing in a hard to determine manner).
- Through some incorrect incantation in the git dance, I have ended up with duplicate commits; not sure how or how to resolve it, but I suspect it is related to having to merge updated master into branch.