Finite State Machine - enemies still perform all their actions in a single frame

Hey, when I finally got back to classes today and set up my FSM as described in my previous questions, I received the same problems as my first question(the framerate drops dramatically, the enemies perform all their actions, and the game eventually crashes). Can anyone explain to me what the problem is with my current script that keeps providing this same problem?

var speed = 10;
var minspeed = 2.5;
speed *= Random.value;
speed += minspeed;
var shipTarget : Transform;

enum State {
    WAITING,
    SEEKING,
    ATTACKING,
    MOVING
}

var state : State;

function Update () {
    if (Time.timeScale > 0) {
        if (transform.position.y == 0) {
            switch (state) 
            {
            case State.WAITING:
                shipWait(5);
                break;
            case State.SEEKING:
                facePlayer(shipTarget);
                break;
            case State.ATTACKING:
                fire();
                break;
            case State.MOVING:
                moveForward();
                break;
            }

        }
    }
}

function shipWait (waitTime : float) { //Waits up to 5 seconds.
    yield WaitForSeconds(Random.value * waitTime);
}

function moveForward () { //Simply moves forward
transform.Translate (0, 0, speed * Time.deltaTime);
}

function facePlayer (target : Transform) { //Turns to face the player
        if (shipTarget) {
        // Look at and dampen the rotation
        var rotation = Quaternion.LookRotation(shipTarget.position - transform.position);
        transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime);
    }
}

function fire () {
    gameObject.SendMessage("Shoot", SendMessageOptions.DontRequireReceiver);
}

There aren't any pauses in your script. Update is called every frame and everything in it is executed every frame.

var waitTime : float;

if ( Time.timeScale > 0 && waitTime <= 0 ) {
  // switch
} else if ( waitTime > 0 ) {
  waitTime -= Time.deltaTime;
}

function ShipWait( time : float ) {
  waitTime = time;
}

Functions should be CamelCase while variables are camelCase - to conform with Unity's standards and to make your code super easy to read later when you come back after a break. :)

Enums I generally capitalize the way you have, though the members I just use CamelCase for. I haven't seen (or looked for) standards on enums, but as long as they're obviously different from normal variables you probably won't have an issue. :D