Introduce concept of same-time edges.

Previously even edges occurring at the same time were
treated as independent in time potentially causing
multiple output events to be scheduled at the same time.
While this behavior can be worked with by using total
event ordering having transient events at the same time
still isn't what we want.

This commit introduced the concept of a second ordering
value called "group" for events. The core guarantees to
passing a "last_in_group" flag to the last event processed
for a group at a specific time.

This is used by the Edge class. It sets the group to be the
id of the element the edge occurs on. This way edges on an
element can be processed without creating followup events right
away. Only when the last_in_group flag is passed is a new
"clock" function called on Element which causes the creation
of the future output events.

This way multiple inputs one the same element will not produce
transient outputs at the same time like they used to.