In General -
You'll have to look at the use cases you want to cover: You said it's about "sequential events to occur", which sounds like users want to advance or delay events (1). You also said sometimes large movements are required (2). Additional questions are:
How many items are (typically) in the list?
How many items does the user (typically) need to move (into different destinations)?
Do users need to move single rows, or entire blocks of rows?
Are the top and bottom places often-used targets?
(1) requires up and down functions on all items, as @Izhaki already explained very nicely.
(5) requires the possibility to mark a range of rows, and movement of this block. The typical solution is a checkbox on each row, and toolbar functions operating on selected rows.
(6) will require a move-to-top function in addition to move-up (and same for down direction).
(2) might - depending on the answer to (3) - require entering the destination instead of moving small steps. An easy solution is an input field showing the current position and allowing to enter a new position. In this case, how does the user know the new position (assuming so many items that the destination is not visible on the same screen)? If large moves are (nearly) always to the top or bottom, maybe that solution is sufficient?
(4) can even indicate a completely different design: If the order needs to be constructed anew, picking the next item from a list of still remaining ones might be more appropriate (i.e., recreating a new list from an existing one which is emptied in the process).
you have no need for moving blocks of rows, and have a large list of rows where only a few need reordering, you might end up with a design that has move-to-top, move-up-10-rows, move-up-1-row, move-down-1-row, move-down-10-rows, move-to-bottom as functions per row.
Displaying six buttons per row is visually far too busy, but you may consider only reserving the space for these function and displaying them only on hover (if that's available on your target device).