crypto: introduce ECDH

cc @trevnorris 
Save some computation time and instead do:
```cpp
uint32_t length = (field_size + 7) / 8;
char* data = static_cast<char*>(malloc(length));
CHECK_NE(data, NULL);
int r = ECDH_compute_key(data, length, pub, edch->key_, NULL);
EC_POINT_free(pub);
if (!r) {
  free(data);
  return env->ThrowError("Failed to compute ECDH key");
}

args.GetReturnValue().Set(Buffer::Use(env, data, length));
```