Make message IDs more typesafe.
Improve logging in engine to detail when it closes connections and
performs graceful exits.
Remove panic/recover approach and replace with explicit error checking.

Recover was unexpectedly recovering from network-level errors that
should be regarded as fatal. Rather than whitelist specific errors, it
seems more idiomatic to always check for errors and return them to callers.

http://stackoverflow.com/a/18772200/245018 provides a detailed overview
of the advantages and disadvantages of "repetitive" error handling in
Go. In this commit I've adopted the convention which minimises the lines
of code while still maintaing explicit error handling in each function.
Remove "noData" special error type now we have refactored error handling.

An example of partial output from "go test -short" is below. This demonstrates
the order of operations the test is facilitating, ie:

1. Test performs data transfer to and from TWS (client ID 6)
2. Test asks engine to exit
3. Engine closes connection
4. Reader correctly detects network closed and returns that error

6< &{15 1} &{DU15083}
6< &{9 1} &{1}
6> '9-5-100-0-PCLN-STK--0---SMART-USD--0-'
6< &{4 2} &{-1 2104 Market data farm connection is OK:ibdemo}
6< &{10 8} &{100 {0 PCLN STK  0   SMART NASDAQ USD PCLN} [truncated]
6< &{52 1} &{100}
2014/03/12 11:28:38 6 engine: normal exit
2014/03/12 11:28:38 6 engine: closing connection
6< read tcp 127.0.0.1:4001: use of closed network connection
Remove timeout from engine, as we now receive network timeouts.

Below demonstrates terminating IB Gateway in the middle of a 'go test
-short'. As shown, error EOF (ie an io.EOF) is detected. Interestingly
IB Gateway sends an ErrorMessage 1100 as it's shutting down, so any
active observers could look for that rather than an engine-level
io.EOF error (which I'll be making available in conjunction with a
planned state channel next up). Of course clients cannot rely solely on
that ErrorMessage, as there might be a network issue or SIGKILL on IB
Gateway (which wouldn't therefore have an opportunity to send the 1100).

3> '9-5-100-0-AAPL-STK--0---SMART-USD--0-'
3< &{15 1} &{DU15083}
3< &{9 1} &{1}
3< &{4 2} &{-1 2104 Market data farm connection is OK:ibdemo}
3< EOF
2014/03/12 11:54:55 3 engine: error EOF
2014/03/12 11:54:55 3 engine: closing connection
--- FAIL: TestContractDetails (30.60 seconds)
        engine_test.go:26: received message '&{-1 2104 Market data farm connection is OK:ibdemo}' of ty
pe '*trade.ErrorMessage'
        engine_test.go:26: received message '&{-1 1100 Connectivity between IB and TWS has been lost.}'
 of type '*trade.ErrorMessage'
        engine_test.go:175: received reply nil
        engine_test.go:180:  (error: 'Timeout waiting')
        engine_test.go:182:
        engine_test.go:126: client 3: cannot receive contract details: Timeout waiting
--- FAIL: TestOptionChainRequest (0.00 seconds)
        engine_test.go:141: cannot connect engine: dial tcp 127.0.0.1:4001: connection refused
--- FAIL: TestInstrument (0.00 seconds)
        instrument_test.go:12: cannot connect engine: dial tcp 127.0.0.1:4001: connection refused
--- FAIL: TestMetadata (0.00 seconds)
        metadata_test.go:12: cannot connect engine: dial tcp 127.0.0.1:4001: connection refused
--- FAIL: TestIncomplete (0.00 seconds)
        metadata_test.go:41: cannot connect engine: dial tcp 127.0.0.1:4001: connection refused
Refactor engine concurrency internals and add exit state observers.

Engine logging now only occurs when unexpected conditions are detected.

General engine usage is simplified via subscribe/unsubscribe/stop methods
being well-defined and blocking until the requested operation is
acknowledged as complete. In addition, callers need not continue receiving from
channels they no longer wish to subscribe to, as the unsubscribe methods
now provide an automatic sink pending the unsubscribe being finalised.

Further code refactoring and tidying will be undertaken, but the
existing tests pass and therefore offers a logical commit point.