A couple of other just general design notes here, I created the following concepts:
The ServiceEndpoint is basically just a header + descriptor + id.
The ServiceHeader contains various identifying information about the service such as service name, endpoint url, etc.
The ServiceDescriptor contains the "serialized" configuration for the service which can include pretty much anything (at this point at least) which is needed in order to provide further configuration about the service (i.e. how many retries, exception handler, etc.). Basically any metadata about the service which is not included in the header. Note that it's intended that, when the system launches, it will load all remote service headers from the registry (which should be faster than getting the full endpoint definition) in order to construct it's "local" copy of the registry.
Ultimately, a better approach might even be having it load some standard set of services that it needs, and then going out the registry on demand for any additional services that are requested that it doesn't know about. That would certainly scale better but is out of scope I think for this version.