The stack trace of thrown error objects is created when the object is
instantiated - if we defer to a function to create the error we end
up with misleading stack traces.
This PR instantiates errors where errors occur and also uses the
`err-code` module to add a `.code` property so we don't have to depend
on string error messages for the type of error that was thrown.
* test: openssl interop is now the responsibility of libp2p-crypto
* feat: use libp2p-crypto, not node-forge, for key management
* fix: use libp2p-crypto.pbkdf, not node-forge
* fix: do not ship CMS
This removes all depencies on node-forge
* test: update dependencies
* test: remove dead code