make instance derivation explicit

This is safer anyway. This also gets rid of the `Deriver` type, which only
served to split derivation into two phases. It is now just one phase, which
also means that the user never sees the internal representation of data
types.

The macro now relies on vanilla implicit search earlier in the derivation
phase, which means we have the whole implicit scope at hand. This instantly
allows derivation for mutual data types.