The complex part is to start to think about decompose a big problem into smaller problems solvable by different Erlang modules. When to spawn another process or when to re architecture the code.
Really great work but I would go a little bit ahead and add some more specific Elixir/Erlang part.
Also what really really helped me was to understand how a GenServer was written, it may be worthed to make the student write its own limited version of a GenServer...