Uses existing exposures to determine the "shallow ancestor"

Instead of just trying to find the ancestor, this uses
an existing exposure to find it's ancestor. Also throws
meaningful exceptions when it cannot be determined.

I thought about automagically trying to determine the child
of the ancestor when it wasn't exposed. One approach I
considered was to create the exposure. I thought this might
be too surprising, so instead I decided to raise an exception
so whoever is implementing the code knows that they need
to create the exposure.

Once the child of the ancestor has been found, if the `belongs_to`
association for the ancestor doesn't exist, an exception will be
raised so the person implementing the code can take corrective
action.