I dug into the code and it appears as though while it says the DestinationName is optional, I was getting a null pointer in the code on it.
DestinationName The name of this particular Capability instance (optional)
I added a DestinationName for both of the capabilities, and then tried to register all of the capabilities which was successful.
<Role Name="DeployerCapability" Strategy="MIRROR" >
<Urls>
<Url DestinationName="Production" Value="https://www.my-domain.com/sdl/httpupload" />
<Url DestinationName="Failover" Value="https://www-fo.my-domain.com/sdl/httpupload" />
</Urls>
<Property Name="encoding" Value="UTF-8"/>
We are on a recent cumulative hotfix CD_8.5.0.16047.