Improved iteration in SPLIT-LIST

- The old version had a secondary tail cursor that was used in the
  FROM-END loop to mark the end of iteration. This worked, but SBCL
  produced a lot of code for it. The new version uses a single loop and
  uses (LENGTH LIST) to calculate the split point in the FROM-END
  case. This doesn't actually cause any more steps down the
  list (between NTHCDR and the tail cursor, the whole list was
  traversed), but temporal locality might be affected for N close to the
  length of LIST in the FROM-END case. The size of the assembly produced
  was reduced by about 43%, though, which is nice.