Q:

$observe within an Angular directive is only firing on the first attribute change

I'm trying to write a custom directive but the attribute the directive is observing only seems to change on the initial scope change.  After that, the binding in the view (observed with Firebug) doesn't update any longer.  This seems like a scope problem but I'm out of ideas.  
JSFiddle Link showing code with problem: http://jsfiddle.net/catalyst156/2gp78/ (contents of fiddle below, but it might be useful to mess around with the fiddle itself).
Controller:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js></script>
<script>
var myApp = angular.module('myApp', []);

myApp.directive('testDirective', function () {
    return {
        restrict: 'A',
        replace: true,
        scope: {
            toggle: '@'
        },
        link: function (scope, element, attrs) {
            console.log('...linking testDirective...');

            attrs.$observe('toggle', function (value) {
                console.log('directive: toggle observer');
                if ('true' === value) {
                    console.log('directive: toggle=true');
                } else {
                    console.log('directive: toggle=false');
                }
            });
        }
    };
});

myApp.controller('myCtrl', ['$scope', '$log', function ($scope, $log) {
    $scope.toggleState = false;

    $scope.testToggle = function () {
        $scope.toggleState = true;
        $log.log('controller: toggleState=' + $scope.toggleState);

        setTimeout(turnToggleOff, 2000);
    };

    function turnToggleOff() {
        $scope.toggleState = false;
        $log.log('controller: toggleState=' + $scope.toggleState);
    }
}]);

HTML:
<div ng-app="myApp">
    <div ng-controller="myCtrl">
        <div test-directive toggle={{toggleState}}></div>
        <button ng-click="testToggle()">Toggle Me</button>
    </div>
</div>

Console Output:
1: ...linking testDirective...
2: directive: toggle observer
3: directive: toggle=false
4: controller: toggleState=true
5: directive: toggle observer
6: directive: toggle=true
7: controller: toggleState=false 

I can see the link working and the initial state is set to false as expected (lines 1-3).  The button is clicked and the observer is notified of the change (lines 4-6).  However, when the timer expires and 'toggleState=false', the observer never picks up that change.  (multiple button presses beyond only show the console output from the controller and the observer is never fired again).  

A:

The issue is that angular is unaware of changes made by a setTimeout().  Said another way- setTimeout() does not trigger a $digest cycle.  Angular provides instead $timeout that does the same thing as setTimeout() but it triggers $digest so Angular sees the changes (which in turn will cause your observe to fire).  
So just pass in the $timeout dependency:
myApp.controller('myCtrl', ['$scope', '$log', '$timeout', function ($scope, $log, $timeout) {...}

And switch your timeout call:
$timeout(turnToggleOff, 2000);

Here's an updated fiddle

