Use easily extensible Context object to provide expiry...etc parameters

* Context object, inspired by Finagles stack parameters, provides a
clean way to add context parameters such as expiration, arbitrary flags
...etc, without the need to make API changes.
* Context is an implicit parameter to make it easy to apply same settings
to multiple calls. Implicit parameter can always be exlicitly provided
via the API without using implicit variables.
* Expiration is now wrapped in an Expiry object with different case
classes defining the different options, such as never expiring, or
expiring based on server parameters, or user-defined ones.
* To avoid mixing up variables in request objects, request operation
codes are wrapped in Id() AnyVal class to avoid ordering issues with
message ids.
Add root sbt exec to enable building wo/ previous SBT installations
Hide internal Hot Rod client details in `impl` package

* This helps reduce the amount of code that's exposed to users,
and helps keep code nicely encapsulated.
Update TODO file
Implement basic replace() without returning previous value
Add containsKey method