Use ActiveModel to represent Rapid Connect services and provide validation logic

The existing model was nice and lightweight, but we need something with a little more rigour and a little less duplication. Moving the validation logic into a RapidConnectService class backed by ActiveModel means we can get cleaner separation and less duplication.

This includes reworking of the test cases for parts of Rapid Connect. Care was taken to avoid losing any test cases.