The relayer is primarily composed of two pieces: a set of interfaces to various chains, and an underlying thread-based worker that hooks those interfaces together.
Users should not need to directly interact with the relayer at all except to add new networks, which can be done by creating a new Relayer Interface and hooking it up to the config (both described on the next page)
The Task interface seen in several places in these docs can be broadly modeled as a thin wrapper around a dict, with some special handling. More details can be found in the codebase.