Cleanups and improvements in the RpcError code
This branch makes several cleanups in the RPC error code logic. Notably:
- it separates RpcErrorKind from ErrorKind
- it implements the new "error data" behavior from the spec
- it uses error data to support telling the rpc client that a feature was missing.