Linked list that support modifications during iteration
I haven't done much Kotlin, however something looked wrong and I was curious, so I wrote some tests.  I had a couple of failures, so you may have issues, or it may be that I'm expecting the wrong behaviour.  There's three scenarios to consider.  I've defined a list of string to make it easy to test.
val list = ListenersList&lt;String&gt;()

clear
You've said that you want the code to be tolerant of adding/removing items during iteration.  I assumed that it would therefor also be tolerant of clear being called (it seems equivalent to calling remove on every item).  So, I would expect it to iterate up to the point of the clear being called.  This isn't what happens.  Instead, it iterates past the end of the list.  So, for example:
@Test
fun clearMiddleWorks() {
    list.add(&quot;a&quot;)
    list.add(&quot;b&quot;)
    list.add(&quot;c&quot;)

    var items = &quot;&quot;

    for (item in list) {
        if(item == &quot;a&quot;)
            list.clear()
        items += item
    }

    assertEquals(&quot;a&quot;, items)
}

This test fails, because instead of exiting the loop after &quot;a&quot;, it continues building up the string, and fails on &quot;a&quot; != &quot;abcnull&quot;
end removal
This issue exists in the code you've posted, however it looks like you've cleaned it up in your latest github version.  Removing the last item in the list during iteration, fails to terminate as expected:
@Test
fun removalOfEndWorks() {
    list.add(&quot;a&quot;)
    list.add(&quot;b&quot;)
    list.add(&quot;c&quot;)

    var items = &quot;&quot;

    for (item in list) {
        if(item == &quot;b&quot;) {
            list.remove(&quot;c&quot;)
        }
        items += item
    }

    assertEquals(&quot;ab&quot;, items)
}

This fails with &quot;ab&quot; != &quot;abnull&quot;
remove and add conflict
This may actually be expected behaviour, however it seems odd to me.  If I remove an item from the list, whilst I'm iterating over it, then add an item with the same value, I'd expect that item to be treated the same was as if I'd added a new item, however it isn't.  So, this test passes:
@Test
fun removalAdditionOtherInMiddleWorks() {
    list.add(&quot;a&quot;)
    list.add(&quot;b&quot;)
    list.add(&quot;c&quot;)

    var items = &quot;&quot;


    for (item in list) {
        if(item == &quot;a&quot;) {
            list.remove(&quot;b&quot;)
            list.add(&quot;d&quot;)
        }
        items += item
    }

    assertEquals(&quot;acd&quot;, items)
}

And this test fails:
@Test
fun removalAdditionOfMiddleWorks() {
    list.add(&quot;a&quot;)
    list.add(&quot;b&quot;)
    list.add(&quot;c&quot;)

    var items = &quot;&quot;


    for (item in list) {
        if(item == &quot;a&quot;) {
            list.remove(&quot;b&quot;)
            list.add(&quot;b&quot;)
        }
        items += item
    }

    assertEquals(&quot;acb&quot;, items)
}

It fails because the added in &quot;b&quot; is ignored, so &quot;acb&quot; != &quot;ac&quot;.  Is this expected?