The core project has three main responsibilities and does not rely on any special test engine or protocol:
Assertions
A big library with all the base assertions such as arrays, lists and primitives.
Interfaces
Interfaces such as Node, Result and Reporter.
Setup
Support for fixtures and other setup-related functionality.
The framework does not rely on any specific test engine or protocol.
It is built to be able to be easy to use, extend and maintain.
This is possible due to highly use of interfaces and almost none of the implementation classes are exposed to the public.
The core project does not know anything about the test engine or protocols implemented, which makes the project very isolated.