Add a unit test to demonstrate a use of addActionWithInterval()

Future patches will actually implement the method, but this test will
serve as the blueprint for how we want it to behave.
Restructure actions to represent them internally as tables

This patch makes large changes to the library so that Luvent
represents each action as a table, with its own special metatable and
set of properties controlled by the new private newAction() function.
The public addAction() method is still the way to add actions and has
the same method signature, as does the rest of the public API.

We now use tables inside Luvent to represent actions so that we can
associate arbitrary information with individual actions.  For example,
this is how we plan to support actions that only execute at certain
intervals; we can associate that interval with the action table.

One part of the test suite required removal: an assertion to look
directly into the contents of the ‘actions’ property of an event to
see if Luvent properly added the action.  Instead of updating the
assertion we simply delete it because we do not want to give the idea
that the contents of the ‘actions’ table belong to the public API.
Users may test the length of the ‘actions’ property, as we do in the
test suite, but that is all the information that we treat as part of
the library’s API.
Implement Luvent:addActionWithInterval()

This patch also changes the related test to use os.time() to be
consistent with the implementation of the method, which uses the same
function for tracking time.
Test calling actions with intervals multiple times

This patch changes the test for addActionWithInterval() so that we
call the action once per second.  Then we wait three seconds and
assert that we called the action exactly three times.